Decompiled source of PlantEverything v1.18.2
Advize_PlantEverything.dll
Decompiled 3 weeks 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.18.2.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.18.2.0")] [module: <1a860a07-77c3-4a24-aba1-f305405251d3>RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<4877d133-ed54-40c7-b660-c27d96334b29>Embedded] internal sealed class <4877d133-ed54-40c7-b660-c27d96334b29>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<4877d133-ed54-40c7-b660-c27d96334b29>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <22212778-3fd3-499f-9437-82f4ef29dcef>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <22212778-3fd3-499f-9437-82f4ef29dcef>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <22212778-3fd3-499f-9437-82f4ef29dcef>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [<4877d133-ed54-40c7-b660-c27d96334b29>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <44006564-8c69-4d53-aa62-dd5bf7c634bc>NullableContextAttribute : Attribute { public readonly byte Flag; public <44006564-8c69-4d53-aa62-dd5bf7c634bc>NullableContextAttribute(byte P_0) { Flag = P_0; } } [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] [<4877d133-ed54-40c7-b660-c27d96334b29>Embedded] [CompilerGenerated] internal sealed class <1a860a07-77c3-4a24-aba1-f305405251d3>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <1a860a07-77c3-4a24-aba1-f305405251d3>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Advize_PlantEverything { internal static class ConfigEventHandlers { internal static void CoreSettingChanged(object o, EventArgs e) { PlantEverything.Dbgl("Config setting changed, re-initializing mod", forceLog: false, (LogLevel)16); PlantEverything.InitPieceRefs(); PlantEverything.InitPieces(); PlantEverything.InitSaplingRefs(); PlantEverything.InitSaplings(); PlantEverything.InitCrops(); PlantEverything.InitVines(); PlantEverything.InitCultivator(); } internal static void PieceSettingChanged(object o, EventArgs e) { PlantEverything.Dbgl("Config setting changed, re-initializing pieces", forceLog: false, (LogLevel)16); PlantEverything.InitPieceRefs(); PlantEverything.InitPieces(); PlantEverything.InitCultivator(); } internal static void SaplingSettingChanged(object o, EventArgs e) { PlantEverything.Dbgl("Config setting changed, re-initializing saplings", forceLog: false, (LogLevel)16); PlantEverything.InitSaplingRefs(); PlantEverything.InitSaplings(); PlantEverything.InitCultivator(); } internal static void SeedSettingChanged(object o, EventArgs e) { PlantEverything.Dbgl("Config setting changed, modifying TreeBase drop tables", forceLog: false, (LogLevel)16); PlantEverything.ModifyTreeDrops(); } internal static void CropSettingChanged(object o, EventArgs e) { PlantEverything.Dbgl("Config setting changed, re-initializing crops", forceLog: false, (LogLevel)16); PlantEverything.InitCrops(); } internal static void VineSettingChanged(object o, EventArgs e) { PlantEverything.Dbgl("Config setting changed, re-initializing vines", forceLog: false, (LogLevel)16); PlantEverything.InitVines(); } internal static void ExtraResourcesChanged() { PlantEverything.Dbgl("ExtraResourcesChanged", forceLog: false, (LogLevel)16); PlantEverything.deserializedExtraResources.Clear(); foreach (string item2 in PlantEverything.config.SyncedExtraResources.Value) { ExtraResource item = PluginUtils.DeserializeExtraResource(item2); PlantEverything.deserializedExtraResources.Add(item); } if (Object.op_Implicit((Object)(object)ZNetScene.s_instance)) { PlantEverything.InitExtraResourceRefs(ZNetScene.s_instance); PieceSettingChanged(null, null); } } internal static void ExtraResourcesFileOrSettingChanged(object sender, EventArgs e) { PlantEverything.Dbgl("ExtraResources file or setting has changed", forceLog: false, (LogLevel)16); if (PlantEverything.config.IsSourceOfTruth) { if (PlantEverything.config.EnableExtraResources) { PlantEverything.Dbgl("IsSourceOfTruth: true, loading extra resources from disk", forceLog: false, (LogLevel)16); PluginUtils.LoadExtraResources(); } else { PlantEverything.config.SyncedExtraResources.AssignLocalValue(new List<string>()); } } else { PlantEverything.Dbgl("IsSourceOfTruth: false, extra resources will not be loaded from disk", forceLog: false, (LogLevel)16); } } } 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 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 = PlantEverything.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 PlantEverything.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 = PlantEverything.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() { PlantEverything.PELogger.LogWarning((object)"Cultivator updated through config change, unequipping cultivator"); ((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(PlantEverything.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")) && PlantEverything.config.RequireCultivation; bool num = pdb.isGrounded ?? (!PlantEverything.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 = PlantEverything.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 (PlantEverything.cachedSprites.ContainsKey(val)) { val2 = PlantEverything.cachedSprites[val]; } else { val2 = Sprite.Create(val, spriteSection, Vector2.zero); PlantEverything.cachedSprites.Add(val, val2); } return val2; } catch { PlantEverything.Dbgl("Unable to load texture", forceLog: true, (LogLevel)2); } return null; } private static Texture2D LoadTexture(string fileName) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0058: Expected O, but got Unknown Texture2D val; if (PlantEverything.cachedTextures.ContainsKey(fileName)) { val = PlantEverything.cachedTextures[fileName]; } else { Stream? manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Advize_PlantEverything.Assets." + fileName); byte[] array = new byte[manifestResourceStream.Length]; manifestResourceStream.Read(array, 0, array.Length); Texture2D val2 = new Texture2D(0, 0); ImageConversion.LoadImage(val2, array); val = val2; PlantEverything.cachedTextures.Add(fileName, val); } return val; } internal static Texture2D DuplicateTexture(Sprite sprite) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown Rect textureRect = sprite.textureRect; int num = (int)((Rect)(ref textureRect)).width; textureRect = sprite.textureRect; int num2 = (int)((Rect)(ref textureRect)).height; Texture2D texture = sprite.texture; RenderTexture active = RenderTexture.active; RenderTexture temporary = RenderTexture.GetTemporary(((Texture)texture).width, ((Texture)texture).height, 0, (RenderTextureFormat)7, (RenderTextureReadWrite)2); Graphics.Blit((Texture)(object)texture, temporary); RenderTexture.active = temporary; Texture2D val = new Texture2D(((Texture)texture).width, ((Texture)texture).height); val.ReadPixels(new Rect(0f, 0f, (float)((Texture)texture).width, (float)((Texture)texture).height), 0, 0); val.Apply(); RenderTexture.active = active; RenderTexture.ReleaseTemporary(temporary); Texture2D val2 = new Texture2D(num, num2); textureRect = sprite.textureRect; int num3 = (int)((Rect)(ref textureRect)).x; textureRect = sprite.textureRect; Color[] pixels = val.GetPixels(num3, (int)((Rect)(ref textureRect)).y, num, num2); val2.SetPixels(pixels); val2.Apply(); return val2; } internal static Sprite ModifyTextureColor(Texture2D baseTexture, int width, int height, Color targetColor) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0177: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(width, height); float num = default(float); float num2 = default(float); float num3 = default(float); Color.RGBToHSV(targetColor, ref num, ref num2, ref num3); Color[] pixels = baseTexture.GetPixels(); float[] array = new float[width * height]; float[] array2 = new float[width * height]; float[] array3 = new float[width * height]; float num4 = default(float); float num5 = default(float); float num6 = default(float); for (int i = 0; i < width * height; i++) { Color.RGBToHSV(pixels[i], ref num4, ref num5, ref num6); array[i] = num - num4; array2[i] = num2 - num5; array3[i] = num3 - num6; } float num7 = default(float); float num8 = default(float); float num9 = default(float); for (int j = 0; j < width; j++) { for (int k = 0; k < height; k++) { Color pixel = baseTexture.GetPixel(j, k); float a = pixel.a; val.SetPixel(j, k, Color.clear); if (pixel.a != 0f) { Color.RGBToHSV(pixel, ref num7, ref num8, ref num9); num7 += array[j + k * width]; num8 += array2[j + k * width]; float num10 = ((array3[j + k * width] > 0f) ? 1.5f : (1f / 3f)); num9 *= num9 + array3[j + k * width] * num10; pixel = Color.HSVToRGB(num7, num8, num9); pixel.a = a; val.SetPixel(j, k, pixel); } } } val.Apply(); return Sprite.Create(val, new Rect(0f, 0f, (float)width, (float)height), Vector2.zero); } 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(PlantEverything.CustomConfigPath, "PlantEverything_ExtraResources.cfg"); PlantEverything.Dbgl($"deserializedExtraResources.Count is {PlantEverything.deserializedExtraResources.Count}", forceLog: false, (LogLevel)16); string text2 = ""; text2 = text2 + SerializeExtraResource(PlantEverything.deserializedExtraResources[0]) + ";\n\n"; text2 = text2 + SerializeExtraResource(PlantEverything.deserializedExtraResources[1], prettyPrint: false) + ";\n"; File.WriteAllText(text, text2); PlantEverything.Dbgl("Serialized extraResources to " + text, forceLog: true, (LogLevel)16); } internal static void LoadExtraResources() { PlantEverything.Dbgl("LoadExtraResources", forceLog: false, (LogLevel)16); PlantEverything.deserializedExtraResources.Clear(); string text = "PlantEverything_ExtraResources.cfg"; string text2 = Path.Combine(PlantEverything.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()) { PlantEverything.deserializedExtraResources.Add(item); } else if (!item.prefabName.StartsWith("PE_Fake")) { PlantEverything.Dbgl("Invalid resource, " + item.prefabName + ", configured in " + text + ", skipping entry", forceLog: true, (LogLevel)4); } } } PlantEverything.Dbgl("Loaded extra resources from " + text2, forceLog: true, (LogLevel)16); PlantEverything.Dbgl("Assigning local value from deserializedExtraResources", forceLog: false, (LogLevel)16); List<string> resourcesToSync = new List<string>(); PlantEverything.deserializedExtraResources.ForEach(delegate(ExtraResource er) { resourcesToSync.Add(SerializeExtraResource(er)); }); PlantEverything.config.SyncedExtraResources.AssignLocalValue(resourcesToSync); } catch (Exception ex) { if (ex is FileNotFoundException) { PlantEverything.Dbgl("Error loading data from " + text + ". Generating new file with example values", forceLog: true, (LogLevel)4); PlantEverything.deserializedExtraResources = StaticContent.GenerateExampleResources(); SaveExtraResources(); } else { PlantEverything.Dbgl("Error loading data from " + text + ". Additional resources have not been added", forceLog: false, (LogLevel)4); PlantEverything.deserializedExtraResources.Clear(); } } } internal static void LoadLocalizedStrings() { string path = PlantEverything.config.Language + "_PlantEverything.json"; string text = Path.Combine(PlantEverything.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]); } PlantEverything.Dbgl("Loaded localized strings from " + text, forceLog: false, (LogLevel)16); return; } catch { PlantEverything.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(PlantEverything.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)); PlantEverything.Dbgl("Saved english localized strings to " + text, forceLog: false, (LogLevel)16); } } internal static class StaticContent { private const Biome TemperateBiomes = 25; internal const Biome AllBiomes = 895; internal static readonly int PlaceAnywhereHash = StringExtensionMethods.GetStableHashCode("pe_placeAnywhere"); internal static readonly int ModdedVineHash = StringExtensionMethods.GetStableHashCode("pe_ModdedVine"); internal static readonly int VineColorHash = StringExtensionMethods.GetStableHashCode("pe_VineColor"); internal static readonly int BerryColor1Hash = StringExtensionMethods.GetStableHashCode("pe_BerryColor1"); internal static readonly int BerryColor2Hash = StringExtensionMethods.GetStableHashCode("pe_BerryColor2"); internal static readonly int BerryColor3Hash = StringExtensionMethods.GetStableHashCode("pe_BerryColor3"); internal static readonly Vector3 ColorBlackVector3 = new Vector3(0.00012345f, 0.00012345f, 0.00012345f); internal static readonly Color ColorVineGreen = new Color(0.729f, 1f, 0.525f, 1f); internal static readonly Color ColorVineRed = new Color(0.867f, 0f, 0.278f, 1f); internal static readonly Color ColorBerryGreen = new Color(1f, 1f, 1f, 1f); internal static readonly Color ColorBerryRed = new Color(1f, 0f, 0f, 1f); internal static string[] layersForPieceRemoval = new string[4] { "item", "piece_nonsolid", "Default_small", "Default" }; 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." } }; 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 bool OverrideVines => PlantEverything.config.AshVineStyle != AshVineStyle.Custom; internal static bool OverrideBerries => PlantEverything.config.VineBerryStyle != VineBerryStyle.Custom; internal static Color VineColorFromConfig { get { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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) if (PlantEverything.config.AshVineStyle != AshVineStyle.Custom) { if (PlantEverything.config.AshVineStyle != AshVineStyle.MeadowsGreen) { return ColorVineRed; } return ColorVineGreen; } return PlantEverything.config.VinesColor; } } internal static List<Color> BerryColorsFromConfig { get { //IL_002b: 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) if (PlantEverything.config.VineBerryStyle != VineBerryStyle.Custom) { if (PlantEverything.config.VineBerryStyle != VineBerryStyle.RedGrapes) { return Enumerable.Repeat<Color>(ColorBerryGreen, 3).ToList(); } return Enumerable.Repeat<Color>(ColorBerryRed, 3).ToList(); } return PlantEverything.config.BerryColors.Select((ConfigEntry<Color> x) => x.Value).ToList(); } } internal static Dictionary<GameObject, GameObject> TreesToSeeds { get { object obj = treesToSeeds; if (obj == null) { obj = new Dictionary<GameObject, GameObject> { { PlantEverything.prefabRefs["Birch1"], PlantEverything.prefabRefs["BirchSeeds"] }, { PlantEverything.prefabRefs["Birch2"], PlantEverything.prefabRefs["BirchSeeds"] }, { PlantEverything.prefabRefs["Birch2_aut"], PlantEverything.prefabRefs["BirchSeeds"] }, { PlantEverything.prefabRefs["Birch1_aut"], PlantEverything.prefabRefs["BirchSeeds"] }, { PlantEverything.prefabRefs["Oak1"], PlantEverything.prefabRefs["Acorn"] }, { PlantEverything.prefabRefs["SwampTree1"], PlantEverything.prefabRefs["AncientSeed"] }, { PlantEverything.prefabRefs["Beech1"], PlantEverything.prefabRefs["BeechSeeds"] }, { PlantEverything.prefabRefs["Pinetree_01"], PlantEverything.prefabRefs["PineCone"] }, { PlantEverything.prefabRefs["FirTree"], PlantEverything.prefabRefs["FirCone"] } }; treesToSeeds = (Dictionary<GameObject, GameObject>)obj; } return (Dictionary<GameObject, GameObject>)obj; } } internal static Vector3 ColorToVector3(Color color) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (!(color == Color.black)) { return new Vector3(color.r, color.g, color.b); } return ColorBlackVector3; } internal static Color Vector3ToColor(Vector3 vector3) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (!(vector3 == ColorBlackVector3)) { return new Color(vector3.x, vector3.y, vector3.z); } return Color.black; } 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_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_0130: 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_035b: Unknown result type (might be due to invalid IL or missing references) //IL_03d6: Unknown result type (might be due to invalid IL or missing references) //IL_0451: Unknown result type (might be due to invalid IL or missing references) //IL_0760: Unknown result type (might be due to invalid IL or missing references) //IL_077a: Unknown result type (might be due to invalid IL or missing references) //IL_0794: Unknown result type (might be due to invalid IL or missing references) //IL_07ae: Unknown result type (might be due to invalid IL or missing references) bool enforceBiomes = PlantEverything.config.EnforceBiomes; List<PieceDB> list = new List<PieceDB>(10) { new PieceDB { key = "RaspberryBush", ResourceCost = PlantEverything.config.RaspberryCost, resourceReturn = PlantEverything.config.RaspberryReturn, respawnTime = PlantEverything.config.RaspberryRespawnTime, biome = (Biome)(enforceBiomes ? 1 : 0), icon = true, recover = PlantEverything.config.RecoverResources }, new PieceDB { key = "BlueberryBush", ResourceCost = PlantEverything.config.BlueberryCost, resourceReturn = PlantEverything.config.BlueberryReturn, respawnTime = PlantEverything.config.BlueberryRespawnTime, biome = (Biome)(enforceBiomes ? 8 : 0), icon = true, recover = PlantEverything.config.RecoverResources }, new PieceDB { key = "CloudberryBush", ResourceCost = PlantEverything.config.CloudberryCost, resourceReturn = PlantEverything.config.CloudberryReturn, respawnTime = PlantEverything.config.CloudberryRespawnTime, biome = (Biome)(enforceBiomes ? 16 : 0), icon = true, recover = PlantEverything.config.RecoverResources }, new PieceDB { key = "Pickable_Mushroom", ResourceCost = PlantEverything.config.MushroomCost, resourceReturn = PlantEverything.config.MushroomReturn, respawnTime = PlantEverything.config.MushroomRespawnTime, recover = PlantEverything.config.RecoverResources, Name = "PickableMushroom", isGrounded = true }, new PieceDB { key = "Pickable_Mushroom_yellow", ResourceCost = PlantEverything.config.YellowMushroomCost, resourceReturn = PlantEverything.config.YellowMushroomReturn, respawnTime = PlantEverything.config.YellowMushroomRespawnTime, recover = PlantEverything.config.RecoverResources, Name = "PickableYellowMushroom", isGrounded = true }, new PieceDB { key = "Pickable_Mushroom_blue", ResourceCost = PlantEverything.config.BlueMushroomCost, resourceReturn = PlantEverything.config.BlueMushroomReturn, respawnTime = PlantEverything.config.BlueMushroomRespawnTime, recover = PlantEverything.config.RecoverResources, Name = "PickableBlueMushroom", isGrounded = true }, new PieceDB { key = "Pickable_Thistle", ResourceCost = PlantEverything.config.ThistleCost, resourceReturn = PlantEverything.config.ThistleReturn, respawnTime = PlantEverything.config.ThistleRespawnTime, biome = (Biome)(enforceBiomes ? 8 : 0), recover = PlantEverything.config.RecoverResources, Name = "PickableThistle", isGrounded = true }, new PieceDB { key = "Pickable_Dandelion", ResourceCost = PlantEverything.config.DandelionCost, resourceReturn = PlantEverything.config.DandelionReturn, respawnTime = PlantEverything.config.DandelionRespawnTime, biome = (Biome)(enforceBiomes ? 1 : 0), recover = PlantEverything.config.RecoverResources, Name = "PickableDandelion", isGrounded = true }, new PieceDB { key = "Pickable_SmokePuff", ResourceCost = PlantEverything.config.SmokePuffCost, resourceReturn = PlantEverything.config.SmokePuffReturn, respawnTime = PlantEverything.config.SmokePuffRespawnTime, biome = (Biome)(enforceBiomes ? 32 : 0), recover = PlantEverything.config.RecoverResources, Name = "PickableSmokePuff", isGrounded = true }, new PieceDB { key = "Pickable_Fiddlehead", ResourceCost = PlantEverything.config.FiddleheadCost, resourceReturn = PlantEverything.config.FiddleheadReturn, respawnTime = PlantEverything.config.FiddleheadRespawnTime, biome = (Biome)(enforceBiomes ? 32 : 0), icon = true, recover = PlantEverything.config.RecoverResources, Name = "PickableFiddlehead", isGrounded = true, extraDrops = true } }; if (PlantEverything.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 (PlantEverything.config.EnableDebris) { list.AddRange(new <>z__ReadOnlyArray<PieceDB>(new PieceDB[3] { new PieceDB { key = "Pickable_Branch", ResourceCost = PlantEverything.config.PickableBranchCost, resourceReturn = PlantEverything.config.PickableBranchReturn, respawnTime = PlantEverything.config.PickableBranchRespawnTime, recover = PlantEverything.config.RecoverResources, Name = "PickableBranch", isGrounded = true }, new PieceDB { key = "Pickable_Stone", ResourceCost = PlantEverything.config.PickableStoneCost, resourceReturn = PlantEverything.config.PickableStoneReturn, respawnTime = PlantEverything.config.PickableStoneRespawnTime, recover = PlantEverything.config.RecoverResources, Name = "PickableStone", isGrounded = true, hideWhenPicked = true }, new PieceDB { key = "Pickable_Flint", ResourceCost = PlantEverything.config.PickableFlintCost, resourceReturn = PlantEverything.config.PickableFlintReturn, respawnTime = PlantEverything.config.PickableFlintRespawnTime, recover = PlantEverything.config.RecoverResources, Name = "PickableFlint", isGrounded = true } })); } if (PlantEverything.config.EnableExtraResources) { string[] array = layersForPieceRemoval; List<string> list2 = new List<string>(array.Length); list2.AddRange(array); List<string> list3 = list2; bool resolveMissingReferences = false; foreach (ExtraResource deserializedExtraResource in PlantEverything.deserializedExtraResources) { if (!PlantEverything.prefabRefs.ContainsKey(deserializedExtraResource.prefabName) || !Object.op_Implicit((Object)(object)PlantEverything.prefabRefs[deserializedExtraResource.prefabName])) { PlantEverything.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)) { PlantEverything.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 = PlantEverything.prefabRefs[deserializedExtraResource.prefabName].GetComponentsInChildren<Collider>(); for (int i = 0; i < componentsInChildren.Length; i++) { string item = LayerMask.LayerToName(((Component)componentsInChildren[i]).gameObject.layer); list3.Add(item); } } layersForPieceRemoval = list3.Distinct().ToArray(); PlantEverything.resolveMissingReferences = resolveMissingReferences; } return list; } internal static List<SaplingDB> GenerateCustomSaplingRefs() { //IL_002f: 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_020d: 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)(PlantEverything.config.EnforceBiomes ? 57 : 895), source = "AshlandsTree3", Resources = new Dictionary<string, int> { { "BeechSeeds", 1 }, { "SulfurStone", 1 } }, icon = true, growTime = PlantEverything.config.AshwoodGrowthTime, growRadius = PlantEverything.config.AshwoodGrowRadius, minScale = PlantEverything.config.AshwoodMinScale, maxScale = PlantEverything.config.AshwoodMaxScale, grownPrefabs = (GameObject[])(object)new GameObject[4] { PlantEverything.prefabRefs["AshlandsTree3"], PlantEverything.prefabRefs["AshlandsTree4"], PlantEverything.prefabRefs["AshlandsTree5"], PlantEverything.prefabRefs["AshlandsTree6_big"] }, tolerateHeat = true }); list.Add(new SaplingDB { key = "Ygga_Sapling", biome = (Biome)(PlantEverything.config.EnforceBiomes ? 537 : 895), source = "YggaShoot_small1", Resource = new KeyValuePair<string, int>("Sap", 1), icon = true, growTime = PlantEverything.config.YggaGrowthTime, growRadius = PlantEverything.config.YggaGrowRadius, minScale = PlantEverything.config.YggaMinScale, maxScale = PlantEverything.config.YggaMaxScale, grownPrefabs = (GameObject[])(object)new GameObject[3] { PlantEverything.prefabRefs["YggaShoot1"], PlantEverything.prefabRefs["YggaShoot2"], PlantEverything.prefabRefs["YggaShoot3"] } }); list.Add(new SaplingDB { key = "Ancient_Sapling", biome = (Biome)(PlantEverything.config.EnforceBiomes ? 27 : 895), source = "SwampTree1", Resource = new KeyValuePair<string, int>("AncientSeed", 1), icon = true, growTime = PlantEverything.config.AncientGrowthTime, growRadius = PlantEverything.config.AncientGrowRadius, minScale = PlantEverything.config.AncientMinScale, maxScale = PlantEverything.config.AncientMaxScale, grownPrefabs = (GameObject[])(object)new GameObject[1] { PlantEverything.prefabRefs["SwampTree1"] } }); list.Add(new SaplingDB { key = "Autumn_Birch_Sapling", biome = (Biome)(PlantEverything.config.EnforceBiomes ? 25 : 895), source = "Birch1_aut", Resource = new KeyValuePair<string, int>("BirchSeeds", 1), icon = true, growTime = PlantEverything.config.AutumnBirchGrowthTime, growRadius = PlantEverything.config.AutumnBirchGrowRadius, minScale = PlantEverything.config.AutumnBirchMinScale, maxScale = PlantEverything.config.AutumnBirchMaxScale, grownPrefabs = (GameObject[])(object)new GameObject[2] { PlantEverything.prefabRefs["Birch1_aut"], PlantEverything.prefabRefs["Birch2_aut"] } }); return list; } internal static List<SaplingDB> GenerateVanillaSaplingRefs() { //IL_002d: 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_010f: 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_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)(PlantEverything.config.EnforceBiomesVanilla ? 25 : 895), growTime = PlantEverything.config.BeechGrowthTime, growRadius = PlantEverything.config.BeechGrowRadius, minScale = PlantEverything.config.BeechMinScale, maxScale = PlantEverything.config.BeechMaxScale }, new SaplingDB { key = "PineTree_Sapling", biome = (Biome)(PlantEverything.config.EnforceBiomesVanilla ? 25 : 895), growTime = PlantEverything.config.PineGrowthTime, growRadius = PlantEverything.config.PineGrowRadius, minScale = PlantEverything.config.PineMinScale, maxScale = PlantEverything.config.PineMaxScale }, new SaplingDB { key = "FirTree_Sapling", biome = (Biome)(PlantEverything.config.EnforceBiomesVanilla ? 29 : 895), growTime = PlantEverything.config.FirGrowthTime, growRadius = PlantEverything.config.FirGrowRadius, minScale = PlantEverything.config.FirMinScale, maxScale = PlantEverything.config.FirMaxScale, tolerateCold = true }, new SaplingDB { key = "Birch_Sapling", biome = (Biome)(PlantEverything.config.EnforceBiomesVanilla ? 25 : 895), growTime = PlantEverything.config.BirchGrowthTime, growRadius = PlantEverything.config.BirchGrowRadius, minScale = PlantEverything.config.BirchMinScale, maxScale = PlantEverything.config.BirchMaxScale }, new SaplingDB { key = "Oak_Sapling", biome = (Biome)(PlantEverything.config.EnforceBiomesVanilla ? 25 : 895), growTime = PlantEverything.config.OakGrowthTime, growRadius = PlantEverything.config.OakGrowRadius, minScale = PlantEverything.config.OakMinScale, maxScale = PlantEverything.config.OakMaxScale } }; } internal static List<PrefabDB> GenerateCropRefs() { //IL_003b: 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_00e3: 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_018b: 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_0236: 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_02e4: 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 = PlantEverything.config.EnableCropOverrides; bool enforceBiomesVanilla = PlantEverything.config.EnforceBiomesVanilla; return new List<PrefabDB>(10) { new PrefabDB { key = "sapling_barley", biome = (Biome)(enforceBiomesVanilla ? 16 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.BarleyCost), resourceReturn = (enableCropOverrides ? PlantEverything.config.BarleyReturn : 2) }, new PrefabDB { key = "sapling_carrot", biome = (Biome)(enforceBiomesVanilla ? 25 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.CarrotCost), resourceReturn = ((!enableCropOverrides) ? 1 : PlantEverything.config.CarrotReturn) }, new PrefabDB { key = "sapling_flax", biome = (Biome)(enforceBiomesVanilla ? 16 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.FlaxCost), resourceReturn = (enableCropOverrides ? PlantEverything.config.FlaxReturn : 2) }, new PrefabDB { key = "sapling_onion", biome = (Biome)(enforceBiomesVanilla ? 25 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.OnionCost), resourceReturn = ((!enableCropOverrides) ? 1 : PlantEverything.config.OnionReturn) }, new PrefabDB { key = "sapling_seedcarrot", biome = (Biome)(enforceBiomesVanilla ? 25 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.SeedCarrotCost), resourceReturn = (enableCropOverrides ? PlantEverything.config.SeedCarrotReturn : 3) }, new PrefabDB { key = "sapling_seedonion", biome = (Biome)(enforceBiomesVanilla ? 25 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.SeedOnionCost), resourceReturn = (enableCropOverrides ? PlantEverything.config.SeedOnionReturn : 3) }, new PrefabDB { key = "sapling_seedturnip", biome = (Biome)(enforceBiomesVanilla ? 539 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.SeedTurnipCost), resourceReturn = (enableCropOverrides ? PlantEverything.config.SeedTurnipReturn : 3) }, new PrefabDB { key = "sapling_turnip", biome = (Biome)(enforceBiomesVanilla ? 539 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.TurnipCost), resourceReturn = ((!enableCropOverrides) ? 1 : PlantEverything.config.TurnipReturn) }, new PrefabDB { key = "sapling_magecap", biome = (Biome)(enforceBiomesVanilla ? 512 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.MagecapCost), resourceReturn = ((!enableCropOverrides) ? 1 : PlantEverything.config.MagecapReturn), extraDrops = true }, new PrefabDB { key = "sapling_jotunpuffs", biome = (Biome)(enforceBiomesVanilla ? 512 : 895), resourceCost = ((!enableCropOverrides) ? 1 : PlantEverything.config.JotunPuffsCost), resourceReturn = ((!enableCropOverrides) ? 1 : PlantEverything.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 }); PlantEverything.prefabRefs[((Object)customPlant).name] = customPlant; } return list; } } internal sealed class ModConfig { internal class ConfigurationManagerAttributes { public bool? Browsable; [<22212778-3fd3-499f-9437-82f4ef29dcef>Nullable(2)] public string Category; public int? Order; public bool? ReadOnly; } [<44006564-8c69-4d53-aa62-dd5bf7c634bc>NullableContext(2)] [<22212778-3fd3-499f-9437-82f4ef29dcef>Nullable(0)] internal class ConfigManagerHelper { private static Assembly BepinexConfigManager => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault([<44006564-8c69-4d53-aa62-dd5bf7c634bc>NullableContext(0)] (Assembly a) => a.GetName().Name == "ConfigurationManager"); private static Type ConfigManagerType => BepinexConfigManager?.GetType("ConfigurationManager.ConfigurationManager"); private static object ConfigManager { get { if (!(ConfigManagerType == null)) { return Chainloader.ManagerObject.GetComponent(ConfigManagerType); } return null; } } internal static void ReloadConfigDisplay() { ConfigManager?.GetType().GetMethod("BuildSettingList").Invoke(ConfigManager, Array.Empty<object>()); } } private readonly ConfigFile ConfigFile; private readonly ConfigSync ConfigSync; private readonly ConfigEntry<bool> serverConfigLocked; internal readonly ConfigEntry<int> nexusID; private readonly ConfigEntry<bool> enableDebugMessages; private readonly ConfigEntry<bool> showPickableSpawners; private readonly ConfigEntry<bool> enableMiscFlora; private readonly ConfigEntry<bool> enableDebris; private readonly ConfigEntry<bool> enableExtraResources; private readonly ConfigEntry<bool> snappableVines; private readonly ConfigEntry<bool> enableLocalization; private readonly ConfigEntry<string> language; private readonly ConfigEntry<string> disabledResourceNames; private readonly ConfigEntry<bool> requireCultivation; private readonly ConfigEntry<bool> placeAnywhere; private readonly ConfigEntry<bool> enforceBiomes; private readonly ConfigEntry<bool> enforceBiomesVanilla; private readonly ConfigEntry<bool> plantsRequireShielding; private readonly ConfigEntry<bool> canRemoveFlora; private readonly ConfigEntry<bool> recoverResources; private readonly ConfigEntry<bool> resourcesSpawnEmpty; private readonly ConfigEntry<bool> enemiesTargetPieces; private readonly ConfigEntry<int> raspberryCost; private readonly ConfigEntry<int> blueberryCost; private readonly ConfigEntry<int> cloudberryCost; private readonly ConfigEntry<int> raspberryRespawnTime; private readonly ConfigEntry<int> blueberryRespawnTime; private readonly ConfigEntry<int> cloudberryRespawnTime; private readonly ConfigEntry<int> raspberryReturn; private readonly ConfigEntry<int> blueberryReturn; private readonly ConfigEntry<int> cloudberryReturn; private readonly ConfigEntry<bool> enableCropOverrides; private readonly ConfigEntry<bool> overrideModdedCrops; private readonly ConfigEntry<bool> cropRequireCultivation; private readonly ConfigEntry<bool> cropRequireSunlight; private readonly ConfigEntry<bool> cropRequireGrowthSpace; private readonly ConfigEntry<bool> enemiesTargetCrops; private readonly ConfigEntry<float> cropMinScale; private readonly ConfigEntry<float> cropMaxScale; private readonly ConfigEntry<float> cropGrowTimeMin; private readonly ConfigEntry<float> cropGrowTimeMax; private readonly ConfigEntry<float> cropGrowRadius; private readonly ConfigEntry<int> barleyCost; private readonly ConfigEntry<int> barleyReturn; private readonly ConfigEntry<int> carrotCost; private readonly ConfigEntry<int> carrotReturn; private readonly ConfigEntry<int> flaxCost; private readonly ConfigEntry<int> flaxReturn; private readonly ConfigEntry<int> onionCost; private readonly ConfigEntry<int> onionReturn; private readonly ConfigEntry<int> seedCarrotCost; private readonly ConfigEntry<int> seedCarrotReturn; private readonly ConfigEntry<int> seedOnionCost; private readonly ConfigEntry<int> seedOnionReturn; private readonly ConfigEntry<int> seedTurnipCost; private readonly ConfigEntry<int> seedTurnipReturn; private readonly ConfigEntry<int> turnipCost; private readonly ConfigEntry<int> turnipReturn; private readonly ConfigEntry<int> magecapCost; private readonly ConfigEntry<int> magecapReturn; private readonly ConfigEntry<int> jotunPuffsCost; private readonly ConfigEntry<int> jotunPuffsReturn; private readonly ConfigEntry<int> pickableBranchCost; private readonly ConfigEntry<int> pickableBranchReturn; private readonly ConfigEntry<int> pickableBranchRespawnTime; private readonly ConfigEntry<int> pickableStoneCost; private readonly ConfigEntry<int> pickableStoneReturn; private readonly ConfigEntry<int> pickableStoneRespawnTime; private readonly ConfigEntry<int> pickableFlintCost; private readonly ConfigEntry<int> pickableFlintReturn; private readonly ConfigEntry<int> pickableFlintRespawnTime; private readonly ConfigEntry<int> mushroomCost; private readonly ConfigEntry<int> yellowMushroomCost; private readonly ConfigEntry<int> blueMushroomCost; private readonly ConfigEntry<int> smokePuffCost; private readonly ConfigEntry<int> mushroomRespawnTime; private readonly ConfigEntry<int> yellowMushroomRespawnTime; private readonly ConfigEntry<int> blueMushroomRespawnTime; private readonly ConfigEntry<int> smokePuffRespawnTime; private readonly ConfigEntry<int> mushroomReturn; private readonly ConfigEntry<int> yellowMushroomReturn; private readonly ConfigEntry<int> blueMushroomReturn; private readonly ConfigEntry<int> smokePuffReturn; private readonly ConfigEntry<int> thistleCost; private readonly ConfigEntry<int> dandelionCost; private readonly ConfigEntry<int> fiddleheadCost; private readonly ConfigEntry<int> thistleRespawnTime; private readonly ConfigEntry<int> dandelionRespawnTime; private readonly ConfigEntry<int> fiddleheadRespawnTime; private readonly ConfigEntry<int> thistleReturn; private readonly ConfigEntry<int> dandelionReturn; private readonly ConfigEntry<int> fiddleheadReturn; private readonly ConfigEntry<bool> overrideModdedSaplings; private readonly ConfigEntry<float> moddedSaplingMinScale; private readonly ConfigEntry<float> moddedSaplingMaxScale; private readonly ConfigEntry<float> moddedSaplingGrowthTime; private readonly ConfigEntry<float> moddedSaplingGrowRadius; private readonly ConfigEntry<float> birchMinScale; private readonly ConfigEntry<float> birchMaxScale; private readonly ConfigEntry<float> oakMinScale; private readonly ConfigEntry<float> oakMaxScale; private readonly ConfigEntry<float> ancientMinScale; private readonly ConfigEntry<float> ancientMaxScale; private readonly ConfigEntry<float> birchGrowthTime; private readonly ConfigEntry<float> oakGrowthTime; private readonly ConfigEntry<float> ancientGrowthTime; private readonly ConfigEntry<float> birchGrowRadius; private readonly ConfigEntry<float> oakGrowRadius; private readonly ConfigEntry<float> ancientGrowRadius; private readonly ConfigEntry<float> beechGrowthTime; private readonly ConfigEntry<float> pineGrowthTime; private readonly ConfigEntry<float> firGrowthTime; private readonly ConfigEntry<float> beechMinScale; private readonly ConfigEntry<float> beechMaxScale; private readonly ConfigEntry<float> pineMinScale; private readonly ConfigEntry<float> pineMaxScale; private readonly ConfigEntry<float> firMinScale; private readonly ConfigEntry<float> firMaxScale; private readonly ConfigEntry<float> beechGrowRadius; private readonly ConfigEntry<float> pineGrowRadius; private readonly ConfigEntry<float> firGrowRadius; private readonly ConfigEntry<float> yggaMinScale; private readonly ConfigEntry<float> yggaMaxScale; private readonly ConfigEntry<float> yggaGrowthTime; private readonly ConfigEntry<float> yggaGrowRadius; private readonly ConfigEntry<float> autumnBirchMinScale; private readonly ConfigEntry<float> autumnBirchMaxScale; private readonly ConfigEntry<float> autumnBirchGrowthTime; private readonly ConfigEntry<float> autumnBirchGrowRadius; private readonly ConfigEntry<float> ashwoodMinScale; private readonly ConfigEntry<float> ashwoodMaxScale; private readonly ConfigEntry<float> ashwoodGrowthTime; private readonly ConfigEntry<float> ashwoodGrowRadius; private readonly ConfigEntry<bool> enableSeedOverrides; private readonly ConfigEntry<int> seedDropMin; private readonly ConfigEntry<int> seedDropMax; private readonly ConfigEntry<int> treeDropMin; private readonly ConfigEntry<int> treeDropMax; private readonly ConfigEntry<float> dropChance; private readonly ConfigEntry<bool> oneOfEach; private readonly ConfigEntry<bool> enablePickableTimers; private readonly ConfigEntry<bool> enablePlantTimers; private readonly ConfigEntry<bool> growthAsPercentage; private readonly ConfigEntry<bool> enableVineOverrides; private readonly ConfigEntry<bool> enableCustomVinePiece; private readonly ConfigEntry<AshVineStyle> ashVineStyle; private readonly ConfigEntry<VineBerryStyle> vineBerryStyle; private readonly ConfigEntry<float> vineAttachDistance; private readonly ConfigEntry<float> vineGrowRadius; private readonly ConfigEntry<float> vineGrowthTime; private readonly ConfigEntry<int> vineBerryRespawnTime; private readonly ConfigEntry<int> vineBerryReturn; private readonly ConfigEntry<Color> ashVineCustomColor; private readonly ConfigEntry<Color> leftBerryColor; private readonly ConfigEntry<Color> centerBerryColor; private readonly ConfigEntry<Color> rightBerryColor; private readonly 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 } }; private List<ConfigEntry<Color>> _BerryColors; 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 FiddleheadCost => fiddleheadCost.Value; internal int ThistleRespawnTime => thistleRespawnTime.Value; internal int DandelionRespawnTime => dandelionRespawnTime.Value; internal int FiddleheadRespawnTime => fiddleheadRespawnTime.Value; internal int ThistleReturn => thistleReturn.Value; internal int DandelionReturn => dandelionReturn.Value; internal int FiddleheadReturn => fiddleheadReturn.Value; internal bool OverrideModdedSaplings => overrideModdedSaplings.Value; internal float ModdedSaplingMinScale => moddedSaplingMinScale.Value; internal float ModdedSaplingMaxScale => moddedSaplingMaxScale.Value; internal float ModdedSaplingGrowthTime => moddedSaplingGrowthTime.Value; internal float ModdedSaplingGrowRadius => moddedSaplingGrowRadius.Value; internal float BirchMinScale => birchMinScale.Value; internal float BirchMaxScale => birchMaxScale.Value; internal float OakMinScale => oakMinScale.Value; internal float OakMaxScale => oakMaxScale.Value; internal float AncientMinScale => ancientMinScale.Value; internal float AncientMaxScale => ancientMaxScale.Value; internal float BirchGrowthTime => Mathf.Max(birchGrowthTime.Value, 10f); internal float OakGrowthTime => Mathf.Max(oakGrowthTime.Value, 10f); internal float AncientGrowthTime => Mathf.Max(ancientGrowthTime.Value, 10f); internal float BirchGrowRadius => birchGrowRadius.Value; internal float OakGrowRadius => oakGrowRadius.Value; internal float AncientGrowRadius => ancientGrowRadius.Value; internal float BeechGrowthTime => Mathf.Max(beechGrowthTime.Value, 10f); internal float PineGrowthTime => Mathf.Max(pineGrowthTime.Value, 10f); internal float FirGrowthTime => Mathf.Max(firGrowthTime.Value, 10f); internal float BeechMinScale => beechMinScale.Value; internal float BeechMaxScale => beechMaxScale.Value; internal float PineMinScale => pineMinScale.Value; internal float PineMaxScale => pineMaxScale.Value; internal float FirMinScale => firMinScale.Value; internal float FirMaxScale => firMaxScale.Value; internal float BeechGrowRadius => beechGrowRadius.Value; internal float PineGrowRadius => pineGrowRadius.Value; internal float FirGrowRadius => firGrowRadius.Value; internal float YggaMinScale => yggaMinScale.Value; internal float YggaMaxScale => yggaMaxScale.Value; internal float YggaGrowthTime => yggaGrowthTime.Value; internal float YggaGrowRadius => yggaGrowRadius.Value; internal float AutumnBirchMinScale => autumnBirchMinScale.Value; internal float AutumnBirchMaxScale => autumnBirchMaxScale.Value; internal float AutumnBirchGrowthTime => autumnBirchGrowthTime.Value; internal float AutumnBirchGrowRadius => autumnBirchGrowRadius.Value; internal float AshwoodMinScale => ashwoodMinScale.Value; internal float AshwoodMaxScale => ashwoodMaxScale.Value; internal float AshwoodGrowthTime => ashwoodGrowthTime.Value; internal float AshwoodGrowRadius => ashwoodGrowRadius.Value; internal bool EnableSeedOverrides => enableSeedOverrides.Value; internal int SeedDropMin => seedDropMin.Value; internal int SeedDropMax => seedDropMax.Value; internal int TreeDropMin => treeDropMin.Value; internal int TreeDropMax => treeDropMax.Value; internal float DropChance => dropChance.Value; internal bool OneOfEach => oneOfEach.Value; internal bool EnablePickableTimers => enablePickableTimers.Value; internal bool EnablePlantTimers => enablePlantTimers.Value; internal bool GrowthAsPercentage => growthAsPercentage.Value; internal bool EnableVineOverrides => enableVineOverrides.Value; internal bool EnableCustomVinePiece => enableCustomVinePiece.Value; internal float VinesAttachDistance => vineAttachDistance.Value; internal float VineGrowRadius => vineGrowRadius.Value; internal float VinesGrowthTime => vineGrowthTime.Value; internal int VineBerryRespawnTime => vineBerryRespawnTime.Value; internal int VineBerryReturn => vineBerryReturn.Value; internal Color VinesColor => ashVineCustomColor.Value; internal List<ConfigEntry<Color>> BerryColors { get { List<ConfigEntry<Color>> list = _BerryColors; if (list == null) { List<ConfigEntry<Color>> obj = new List<ConfigEntry<Color>>(3) { rightBerryColor, centerBerryColor, leftBerryColor }; List<ConfigEntry<Color>> list2 = obj; _BerryColors = obj; list = list2; } return list; } } internal AshVineStyle AshVineStyle => ashVineStyle.Value; internal VineBerryStyle VineBerryStyle => vineBerryStyle.Value; internal CustomSyncedValue<List<string>> SyncedExtraResources => extraResources; internal bool IsSourceOfTruth => ConfigSync.IsSourceOfTruth; private ConfigEntry<T> Config<T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { ConfigEntry<T> val = ConfigFile.Bind<T>(group, name, value, description); ConfigSync.AddConfigEntry<T>(val).SynchronizedConfig = synchronizedSetting; return val; } private ConfigEntry<T> Config<T>(string group, string name, T value, string description, bool synchronizedSetting = true) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown return Config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting); } internal ModConfig(ConfigFile configFile, ConfigSync configSync) { //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Expected O, but got Unknown //IL_042f: Unknown result type (might be due to invalid IL or missing references) //IL_043a: Expected O, but got Unknown //IL_0467: Unknown result type (might be due to invalid IL or missing references) //IL_0472: Expected O, but got Unknown //IL_04a3: Unknown result type (might be due to invalid IL or missing references) //IL_04ae: Expected O, but got Unknown //IL_04df: Unknown result type (might be due to invalid IL or missing references) //IL_04ea: Expected O, but got Unknown //IL_051b: Unknown result type (might be due to invalid IL or missing references) //IL_0526: Expected O, but got Unknown //IL_0557: Unknown result type (might be due to invalid IL or missing references) //IL_0562: Expected O, but got Unknown //IL_0593: Unknown result type (might be due to invalid IL or missing references) //IL_059e: Expected O, but got Unknown //IL_05cb: Unknown result type (might be due to invalid IL or missing references) //IL_05d6: Expected O, but got Unknown //IL_0603: Unknown result type (might be due to invalid IL or missing references) //IL_060e: Expected O, but got Unknown //IL_063b: Unknown result type (might be due to invalid IL or missing references) //IL_0646: Expected O, but got Unknown //IL_0673: Unknown result type (might be due to invalid IL or missing references) //IL_067e: Expected O, but got Unknown //IL_06ab: Unknown result type (might be due to invalid IL or missing references) //IL_06b6: Expected O, but got Unknown //IL_06e3: Unknown result type (might be due to invalid IL or missing references) //IL_06ee: Expected O, but got Unknown //IL_071b: Unknown result type (might be due to invalid IL or missing references) //IL_0726: Expected O, but got Unknown //IL_0753: Unknown result type (might be due to invalid IL or missing references) //IL_075e: Expected O, but got Unknown //IL_078b: Unknown result type (might be due to invalid IL or missing references) //IL_0796: Expected O, but got Unknown //IL_07c3: Unknown result type (might be due to invalid IL or missing references) //IL_07ce: Expected O, but got Unknown //IL_07fb: Unknown result type (might be due to invalid IL or missing references) //IL_0806: Expected O, but got Unknown //IL_0833: Unknown result type (might be due to invalid IL or missing references) //IL_083e: Expected O, but got Unknown //IL_086b: Unknown result type (might be due to invalid IL or missing references) //IL_0876: Expected O, but got Unknown //IL_08a3: Unknown result type (might be due to invalid IL or missing references) //IL_08ae: Expected O, but got Unknown //IL_08db: Unknown result type (might be due to invalid IL or missing references) //IL_08e6: Expected O, but got Unknown //IL_0913: Unknown result type (might be due to invalid IL or missing references) //IL_091e: Expected O, but got Unknown //IL_094b: Unknown result type (might be due to invalid IL or missing references) //IL_0956: Expected O, but got Unknown //IL_0983: Unknown result type (might be due to invalid IL or missing references) //IL_098e: Expected O, but got Unknown //IL_09bb: Unknown result type (might be due to invalid IL or missing references) //IL_09c6: Expected O, but got Unknown //IL_09f3: Unknown result type (might be due to invalid IL or missing references) //IL_09fe: Expected O, but got Unknown //IL_0a2b: Unknown result type (might be due to invalid IL or missing references) //IL_0a36: Expected O, but got Unknown //IL_0a63: Unknown result type (might be due to invalid IL or missing references) //IL_0a6e: Expected O, but got Unknown //IL_0a9b: Unknown result type (might be due to invalid IL or missing references) //IL_0aa6: Expected O, but got Unknown //IL_0ad3: Unknown result type (might be due to invalid IL or missing references) //IL_0ade: Expected O, but got Unknown //IL_0e9c: Unknown result type (might be due to invalid IL or missing references) //IL_0ea7: Expected O, but got Unknown //IL_0ede: Unknown result type (might be due to invalid IL or missing references) //IL_0ee9: Expected O, but got Unknown //IL_0f20: Unknown result type (might be due to invalid IL or missing references) //IL_0f2b: Expected O, but got Unknown //IL_0f62: Unknown result type (might be due to invalid IL or missing references) //IL_0f6d: Expected O, but got Unknown //IL_0fa4: Unknown result type (might be due to invalid IL or missing references) //IL_0faf: Expected O, but got Unknown //IL_1486: Unknown result type (might be due to invalid IL or missing references) //IL_1491: Expected O, but got Unknown //IL_14b8: Unknown result type (might be due to invalid IL or missing references) //IL_14c3: Expected O, but got Unknown //IL_14ea: Unknown result type (might be due to invalid IL or missing references) //IL_14f5: Expected O, but got Unknown //IL_151c: Unknown result type (might be due to invalid IL or missing references) //IL_1527: Expected O, but got Unknown //IL_154e: Unknown result type (might be due to invalid IL or missing references) //IL_1559: Expected O, but got Unknown //IL_1584: Unknown result type (might be due to invalid IL or missing references) //IL_158f: Expected O, but got Unknown //IL_15b6: Unknown result type (might be due to invalid IL or missing references) //IL_15c1: Expected O, but got Unknown //IL_164b: Unknown result type (might be due to invalid IL or missing references) //IL_1656: Expected O, but got Unknown //IL_1689: Unknown result type (might be due to invalid IL or missing references) //IL_1694: Expected O, but got Unknown //IL_16c6: Unknown result type (might be due to invalid IL or missing references) //IL_16d1: Expected O, but got Unknown //IL_1703: Unknown result type (might be due to invalid IL or missing references) //IL_170e: Expected O, but got Unknown //IL_17d4: Unknown result type (might be due to invalid IL or missing references) //IL_17f9: Unknown result type (might be due to invalid IL or missing references) //IL_1804: Expected O, but got Unknown //IL_1829: Unknown result type (might be due to invalid IL or missing references) //IL_184e: Unknown result type (might be due to invalid IL or missing references) //IL_1859: Expected O, but got Unknown //IL_187e: Unknown result type (might be due to invalid IL or missing references) //IL_18a3: Unknown result type (might be due to invalid IL or missing references) //IL_18ae: Expected O, but got Unknown //IL_18d3: Unknown result type (might be due to invalid IL or missing references) //IL_18f8: Unknown result type (might be due to invalid IL or missing references) //IL_1903: Expected O, but got Unknown ConfigFile = configFile; ConfigSync = configSync; configFile.SaveOnConfigSet = false; serverConfigLocked = Config("General", "LockConfiguration", value: true, "If on, the configuration is locked and can be changed by server admins only."); nexusID = Config("General", "NexusID", 1042, new ConfigDescription("Nexus mod ID for updates.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = "Internal", ReadOnly = true } }), synchronizedSetting: false); enableDebugMessages = Config("General", "EnableDebugMessages", value: false, "Enable mod debug messages in console.", synchronizedSetting: false); showPickableSpawners = Config("General", "ShowPickableSpawners", value: true, "Continue to show mushroom, thistle, and dandelion spawners after being picked. (Requires world reload on client to take effect.)", synchronizedSetting: false); enableMiscFlora = Config("General", "EnableMiscFlora", value: true, "Enables small trees, bushes, shrubs, vines, and large mushrooms."); enableDebris = Config("General", "EnableDebris", value: true, "Allows for the placement of debris such as branches, flint, and stone."); enableExtraResources = Config("General", "EnableExtraResources", value: false, "When set to true, the mod will attempt to make user-defined prefabs buildable with the cultivator. Prefabs are defined in PlantEverything_ExtraResources.cfg. If file is not present, an example one will be generated for you."); snappableVines = Config("General", "SnappableVines", value: true, "Enables snap points when placing vines adjacently.", synchronizedSetting: false); enableLocalization = Config("General", "EnableLocalization", value: false, "Enable this to attempt to load localized text data for the language set in the following setting.", synchronizedSetting: false); language = Config("General", "Language", "english", "Language to be used. If EnableLocalization is enabled, game will attempt to load localized text from a file named {language}_PlantEverything.json.", synchronizedSetting: false); disabledResourceNames = Config("General", "DisabledResourceNames", "", new ConfigDescription("To disable specific resources added by this mod (and not add them to the cultivator), list their prefab names here separated by a comma. Names are case-sensitive.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = -1 } })); requireCultivation = Config("Difficulty", "RequireCultivation", value: false, "Pickable resources can only be planted on cultivated ground."); placeAnywhere = Config("Difficulty", "PlaceAnywhere", value: false, "Allow resources to be placed anywhere (not just on the ground). Does not apply to mushrooms or flowers."); enforceBiomes = Config("Difficulty", "EnforceBiomes", value: false, "Restrict modded plantables (pickables and saplings) to being placed in their respective biome."); enforceBiomesVanilla = Config("Difficulty", "EnforceBiomesVanilla", value: true, "Restrict vanilla plantables (crops and saplings) to being placed in their respective biome."); plantsRequireShielding = Config("Difficulty", "PlantsRequireShielding", value: true, "Controls whether plants need shielding to survive in hostile environments."); canRemoveFlora = Config("Difficulty", "CanRemoveFlora", value: false, "Allows the cultivator to deconstruct decorative flora placed by a player. Useful for creative game types."); recoverResources = Config("Difficulty", "RecoverResources", value: false, "Recover resources when pickables are removed with the cultivator. Applies to berries, mushrooms, and flowers."); resourcesSpawnEmpty = Config("Difficulty", "ResourcesSpawnEmpty", value: false, "Specifies whether resources should spawn empty or full. Applies to berry bushes, mushrooms, flowers, and debris."); enemiesTargetPieces = Config("Difficulty", "EnemiesTargetPieces", value: true, "When enabled, enemies may target and attack player placed resources added by the mod. If this setting is changed, pre-existing placed pieces will not be affected until the world/server is reloaded."); raspberryCost = Config("Berries", "RaspberryCost", 5, "Number of raspberries required to place a raspberry bush. Set to 0 to disable the ability to plant this resource."); blueberryCost = Config("Berries", "BlueberryCost", 5, "Number of blueberries required to place a blueberry bush. Set to 0 to disable the ability to plant this resource."); cloudberryCost = Config("Berries", "CloudberryCost", 5, "Number of cloudberries required to place a cloudberry bush. Set to 0 to disable the ability to plant this resource."); raspberryRespawnTime = Config("Berries", "RaspberryRespawnTime", 300, "Number of minutes it takes for a raspberry bush to respawn berries."); blueberryRespawnTime = Config("Berries", "BlueberryRespawnTime", 300, "Number of minutes it takes for a blueberry bush to respawn berries."); cloudberryRespawnTime = Config("Berries", "CloudberryRespawnTime", 300, "Number of minutes it takes for a cloudberry bush to respawn berries."); raspberryReturn = Config("Berries", "RaspberryReturn", 1, "Number of berries a raspberry bush will spawn."); blueberryReturn = Config("Berries", "BlueberryReturn", 1, "Number of berries a blueberry bush will spawn."); cloudberryReturn = Config("Berries", "CloudberryReturn", 1, "Number of berries a cloudberry bush will spawn."); enableCropOverrides = Config("Crops", "EnableCropOverrides", value: false, new ConfigDescription("Enables the [Crops] section of this config.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = 28 } })); overrideModdedCrops = Config("Crops", "OverrideModdedCrops", value: true, new ConfigDescription("Applies all [Crops] settings to 3rd party modded crops.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[1] })); cropMinScale = Config("Crops", "CropMinScale", 0.9f, new ConfigDescription("The minimum scaling factor used to scale crops upon growth.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); cropMaxScale = Config("Crops", "CropMaxScale", 1.1f, new ConfigDescription("The maximum scaling factor used to scale crops upon growth.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); cropGrowTimeMin = Config("Crops", "CropGrowTimeMin", 4000f, new ConfigDescription("Minimum number of seconds it takes for crops to grow (will take at least 10 seconds after planting to grow).", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); cropGrowTimeMax = Config("Crops", "CropGrowTimeMax", 5000f, new ConfigDescription("Maximum number of seconds it takes for crops to grow (will take at least 10 seconds after planting to grow).", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); cropGrowRadius = Config("Crops", "CropGrowRadius", 0.5f, new ConfigDescription("Radius of free space required for crops to grow.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); cropRequireCultivation = Config("Crops", "CropsRequireCultivation", value: true, new ConfigDescription("Crops can only be planted on cultivated ground.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[1] })); cropRequireSunlight = Config("Crops", "CropsRequireSunlight", value: true, new ConfigDescription("Crops can only grow under an open sky.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[1] })); cropRequireGrowthSpace = Config("Crops", "CropsRequireGrowthSpace", value: true, new ConfigDescription("Crops require space to grow. This setting overrides the CropGrowRadius setting but without altering it, allowing grid spacing mods to continue functioning.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[1] })); enemiesTargetCrops = Config("Crops", "EnemiesTargetCrops", value: true, new ConfigDescription("Determines whether enemies will target and attack crops. If this setting is changed, pre-existing placed crops will not be affected until the world/server is reloaded.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[1] })); barleyCost = Config("Crops", "BarleyCost", 1, new ConfigDescription("Resource cost of planting barley.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); barleyReturn = Config("Crops", "BarleyReturn", 2, new ConfigDescription("Resources gained upon harvesting barley (does not apply to wild barley).", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); carrotCost = Config("Crops", "CarrotCost", 1, new ConfigDescription("Resource cost of planting carrots.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); carrotReturn = Config("Crops", "CarrotReturn", 1, new ConfigDescription("Resources gained upon harvesting carrots.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); flaxCost = Config("Crops", "FlaxCost", 1, new ConfigDescription("Resource cost of planting flax.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); flaxReturn = Config("Crops", "FlaxReturn", 2, new ConfigDescription("Resources gained upon harvesting flax (does not apply to wild flax).", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); onionCost = Config("Crops", "OnionCost", 1, new ConfigDescription("Resource cost of planting onions.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); onionReturn = Config("Crops", "OnionReturn", 1, new ConfigDescription("Resources gained upon harvesting onions.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); seedCarrotCost = Config("Crops", "SeedCarrotCost", 1, new ConfigDescription("Resource cost of planting seed carrots.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); seedCarrotReturn = Config("Crops", "SeedCarrotReturn", 3, new ConfigDescription("Resources gained upon harvesting seed carrots.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); seedOnionCost = Config("Crops", "SeedOnionCost", 1, new ConfigDescription("Resource cost of planting seed onions.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); seedOnionReturn = Config("Crops", "SeedOnionReturn", 3, new ConfigDescription("Resources gained upon harvesting seed onions.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); seedTurnipCost = Config("Crops", "SeedTurnipCost", 1, new ConfigDescription("Resource cost of planting seed turnips.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); seedTurnipReturn = Config("Crops", "SeedTurnipReturn", 3, new ConfigDescription("Resources gained upon harvesting seed turnips.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); turnipCost = Config("Crops", "TurnipCost", 1, new ConfigDescription("Resource cost of planting turnips.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); turnipReturn = Config("Crops", "TurnipReturn", 1, new ConfigDescription("Resources gained upon harvesting turnips.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); magecapCost = Config("Crops", "MagecapCost", 1, new ConfigDescription("Resource cost of planting magecap.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); magecapReturn = Config("Crops", "MagecapReturn", 3, new ConfigDescription("Resources gained upon harvesting magecap.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); jotunPuffsCost = Config("Crops", "JotunPuffsCost", 1, new ConfigDescription("Resource cost of planting Jotun puffs.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); jotunPuffsReturn = Config("Crops", "JotunPuffsReturn", 3, new ConfigDescription("Resources gained upon harvesting Jotun puffs.", (AcceptableValueBase)null, new object[1] { cropSettingAttributes[0] })); pickableBranchCost = Config("Debris", "PickableBranchCost", 5, "Amount of wood required to place branch debris. Set to 0 to disable the ability to plant this resource."); pickableBranchReturn = Config("Debris", "PickableBranchReturn", 1, "Amount of wood that branch debris drops when picked."); pickableBranchRespawnTime = Config("Debris", "PickableBranchRespawnTime", 240, "Number of minutes it takes for a pickable branch to respawn."); pickableStoneCost = Config("Debris", "PickableStoneCost", 1, "Amount of stone required to place stone debris. Set to 0 to disable the ability to plant this resource."); pickableStoneReturn = Config("Debris", "PickableStoneReturn", 1, "Amount of stones that stone debris drops when picked."); pickableStoneRespawnTime = Config("Debris", "PickableStoneRespawnTime", 0, "Number of minutes it takes for a pickable Stone to respawn."); pickableFlintCost = Config("Debris", "PickableFlintCost", 5, "Amount of flint required to place flint debris. Set to 0 to disable the ability to plant this resource."); pickableFlintReturn = Config("Debris", "PickableFlintReturn", 1, "Amount of flint that flint debris drops when picked."); pickableFlintRespawnTime = Config("Debris", "PickableFlintRespawnTime", 240, "Number of minutes it takes for pickable flint to respawn."); mushroomCost = Config("Mushrooms", "MushroomCost", 5, "Number of mushrooms required to place a pickable mushroom spawner. Set to 0 to disable the ability to plant this resource."); yellowMushroomCost = Config("Mushrooms", "YellowMushroomCost", 5, "Number of yellow mushrooms required to place a pickable yellow mushroom spawner. Set to 0 to disable the ability to plant this resource."); blueMushroomCost = Config("Mushrooms", "BlueMushroomCost", 5, "Number of blue mushrooms required to place a pickable blue mushroom spawner. Set to 0 to disable the ability to plant this resource."); smokePuffCost = Config("Mushrooms", "SmokepuffCost", 5, "Number of smoke puffs required to place a pickable smoke puff spawner. Set to 0 to disable the ability to plant this resource."); mushroomRespawnTime = Config("Mushrooms", "MushroomRespawnTime", 240, "Number of minutes it takes for mushrooms to respawn."); yellowMushroomRespawnTime = Config("Mushrooms", "YellowMushroomRespawnTime", 240, "Number of minutes it takes for yellow mushrooms to respawn."); blueMushroomRespawnTime = Config("Mushrooms", "BlueMushroomRespawnTime", 240, "Number of minutes it takes for blue mushrooms to respawn."); smokePuffRespawnTime = Config("Mushrooms", "SmokepuffRespawnTime", 240, "Number of minutes it takes for smoke puffs to respawn."); mushroomReturn = Config("Mushrooms", "MushroomReturn", 1, "Number of mushrooms a pickable mushroom spawner will spawn."); yellowMushroomReturn = Config("Mushrooms", "YellowMushroomReturn", 1, "Number of yellow mushrooms a pickable yellow mushroom spawner will spawn."); blueMushroomReturn = Config("Mushrooms", "BlueMushroomReturn", 1, "Number of blue mushrooms a pickable blue mushroom spawner will spawn."); smokePuffReturn = Config("Mushrooms", "SmokepuffReturn", 1, "Number of smoke puffs a pickable smoke puff spawner will spawn."); thistleCost = Config("Flowers", "ThistleCost", 5, "Number of thistle required to place a pickable thistle spawner. Set to 0 to disable the ability to plant this resource."); dandelionCost = Config("Flowers", "DandelionCost", 5, "Number of dandelion required to place a pickable dandelion spawner. Set to 0 to disable the ability to plant this resource."); fiddleheadCost = Config("Flowers", "FiddleheadCost", 15, "Number of fiddlehead required to place a pickable fiddlehead spawner. Set to 0 to disable the ability to plant this resource."); thistleRespawnTime = Config("Flowers", "ThistleRespawnTime", 240, "Number of minutes it takes for thistle to respawn."); dandelionRespawnTime = Config("Flowers", "DandelionRespawnTime", 240, "Number of minutes it takes for dandelion to respawn."); fiddleheadRespawnTime = Config("Flowers", "FiddleheadRespawnTime", 300, "Number of minutes it takes for fiddlehead to respawn."); thistleReturn = Config("Flowers", "ThistleReturn", 1, "Number of thistle a pickable thistle spawner will spawn."); dandelionReturn = Config("Flowers", "DandelionReturn", 1, "Number of dandelion a pickable dandelion spawner will spawn."); fiddleheadReturn = Config("Flowers", "FiddleheadReturn", 3, "Number of fiddlehead a pickable fiddlehead spawner will spawn."); overrideModdedSaplings = Config("Saplings", "OverrideModdedSaplings", value: false, new ConfigDescription("Applies all [Saplings]Modded* settings to 3rd party modded saplings.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = 41 } })); moddedSaplingMinScale = Config("Saplings", "ModdedSaplingMinScale", 0.5f, new ConfigDescription("The minimum scaling factor used to scale a 3rd party modded tree upon growth.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = 37 } })); moddedSaplingMaxScale = Config("Saplings", "ModdedSaplingMaxScale", 2f, new ConfigDescription("The maximum scaling factor used to scale a 3rd party modded tree upon growth.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = 38 } })); moddedSaplingGrowthTime = Config("Saplings", "ModdedSaplingGrowthTime", 3000f, new ConfigDescription("Number of seconds it takes for a 3rd party modded tree to grow from its modded sapling (will take at least 10 seconds after planting to grow).", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = 39 } })); moddedSaplingGrowRadius = Config("Saplings", "ModdedSaplingGrowRadius", 2f, new ConfigDescription("Radius of free space required for a 3rd party modded sapling to grow.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = 40 } })); birchMinScale = Config("Saplings", "BirchMinScale", 0.5f, "The minimum scaling factor used to scale a birch tree upon growth."); birchMaxScale = Config("Saplings", "BirchMaxScale", 1f, "The maximum scaling factor used to scale a birch tree upon growth."); oakMinScale = Config("Saplings", "OakMinScale", 0.7f, "The minimum scaling factor used to scale an oak tree upon growth."); oakMaxScale = Config("Saplings", "OakMaxScale", 0.9f, "The maximum scaling factor used to scale an oak tree upon growth."); ancientMinScale = Config("Saplings", "AncientMinScale", 0.5f, "The minimum scaling factor used to scale an ancient tree upon growth."); ancientMaxScale = Config("Saplings", "AncientMaxScale", 2f, "The maximum scaling factor used to scale an ancient tree upon growth."); birchGrowthTime = Config("Saplings", "BirchGrowthTime", 3000f, "Number of seconds it takes for a birch tree to grow from a birch sapling (will take at least 10 seconds after planting to grow)."); oakGrowthTime = Config("Saplings", "OakGrowthTime", 3000f, "Number of seconds it takes for an oak tree to grow from an oak sapling (will take at least 10 seconds after planting to grow)."); ancientGrowthTime = Config("Saplings", "AncientGrowthTime", 3000f, "Number of seconds it takes for an ancient tree to grow from an ancient sapling (will take at least 10 seconds after planting to grow)."); birchGrowRadius = Config("Saplings", "BirchGrowRadius", 2f, "Radius of free space required for a birch sapling to grow."); oakGrowRadius = Config("Saplings", "OakGrowRadius", 3f, "Radius of free space required for an oak sapling to grow."); ancientGrowRadius = Config("Saplings", "AncientGrowRadius", 2f, "Radius of free space required for an ancient sapling to grow."); beechGrowthTime = Con