Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of MoreTerrainTypes v1.0.3
plugins/MoreTerrainTypes/TerrainHoe.dll
Decompiled 3 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; 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 System.Text; using System.Text.RegularExpressions; using System.Threading; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using HarmonyLib; using JetBrains.Annotations; using LocalizationManager; using Microsoft.CodeAnalysis; using ServerSync; using TMPro; using UnityEngine; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.ObjectPool; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.BufferedDeserialization; using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization.Callbacks; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: AssemblyFileVersion("1.0.2")] [assembly: Guid("E0E2F92E-557C-4A05-9D89-AA92A0BD75C4")] [assembly: ComVisible(false)] [assembly: AssemblyTrademark("")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyProduct("TerrainHoe")] [assembly: AssemblyCompany("RustyMods")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyDescription("")] [assembly: AssemblyTitle("TerrainHoe")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.2.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<5f20fe82-5191-4473-8be0-92095be81f5c>Embedded] internal sealed class <5f20fe82-5191-4473-8be0-92095be81f5c>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] [CompilerGenerated] [<5f20fe82-5191-4473-8be0-92095be81f5c>Embedded] internal sealed class <18f04136-86b9-4dc0-a7a0-ae8e922ae27f>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <18f04136-86b9-4dc0-a7a0-ae8e922ae27f>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <18f04136-86b9-4dc0-a7a0-ae8e922ae27f>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } } namespace LocalizationManager { [PublicAPI] public class Localizer { private static readonly Dictionary<string, Dictionary<string, Func<string>>> PlaceholderProcessors; private static readonly Dictionary<string, Dictionary<string, string>> loadedTexts; private static readonly ConditionalWeakTable<Localization, string> localizationLanguage; private static readonly List<WeakReference<Localization>> localizationObjects; private static BaseUnityPlugin _plugin; private static readonly List<string> fileExtensions; private static BaseUnityPlugin plugin { get { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown if (_plugin == null) { IEnumerable<TypeInfo> source; try { source = Assembly.GetExecutingAssembly().DefinedTypes.ToList(); } catch (ReflectionTypeLoadException ex) { source = from t in ex.Types where t != null select t.GetTypeInfo(); } _plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First((TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } private static void UpdatePlaceholderText(Localization localization, string key) { localizationLanguage.TryGetValue(localization, out var value); string text = loadedTexts[value][key]; if (PlaceholderProcessors.TryGetValue(key, out var value2)) { text = value2.Aggregate(text, (string current, KeyValuePair<string, Func<string>> kv) => current.Replace("{" + kv.Key + "}", kv.Value())); } localization.AddWord(key, text); } public static void AddPlaceholder<[<18f04136-86b9-4dc0-a7a0-ae8e922ae27f>Nullable(1)] T>(string key, string placeholder, ConfigEntry<T> config, Func<T, string> convertConfigValue = null) { if (convertConfigValue == null) { convertConfigValue = (T val) => val.ToString(); } if (!PlaceholderProcessors.ContainsKey(key)) { PlaceholderProcessors[key] = new Dictionary<string, Func<string>>(); } config.SettingChanged += delegate { UpdatePlaceholder(); }; if (loadedTexts.ContainsKey(Localization.instance.GetSelectedLanguage())) { UpdatePlaceholder(); } void UpdatePlaceholder() { PlaceholderProcessors[key][placeholder] = () => convertConfigValue(config.Value); UpdatePlaceholderText(Localization.instance, key); } } public static void AddText(string key, string text) { List<WeakReference<Localization>> list = new List<WeakReference<Localization>>(); foreach (WeakReference<Localization> localizationObject in localizationObjects) { if (localizationObject.TryGetTarget(out var target)) { Dictionary<string, string> dictionary = loadedTexts[localizationLanguage.GetOrCreateValue(target)]; if (!target.m_translations.ContainsKey(key)) { dictionary[key] = text; target.AddWord(key, text); } } else { list.Add(localizationObject); } } foreach (WeakReference<Localization> item in list) { localizationObjects.Remove(item); } } public static void Load() { LoadLocalization(Localization.instance, Localization.instance.GetSelectedLanguage()); } private static void LoadLocalization(Localization __instance, string language) { if (!localizationLanguage.Remove(__instance)) { localizationObjects.Add(new WeakReference<Localization>(__instance)); } localizationLanguage.Add(__instance, language); Dictionary<string, string> dictionary = new Dictionary<string, string>(); foreach (string item in from f in Directory.GetFiles(Path.GetDirectoryName(Paths.PluginPath), plugin.Info.Metadata.Name + ".*", SearchOption.AllDirectories) where fileExtensions.IndexOf(Path.GetExtension(f)) >= 0 select f) { string text = Path.GetFileNameWithoutExtension(item).Split(new char[1] { '.' })[1]; if (dictionary.ContainsKey(text)) { Debug.LogWarning((object)("Duplicate key " + text + " found for " + plugin.Info.Metadata.Name + ". The duplicate file found at " + item + " will be skipped.")); } else { dictionary[text] = item; } } byte[] array = LoadTranslationFromAssembly("English"); if (array == null) { throw new Exception("Found no English localizations in mod " + plugin.Info.Metadata.Name + ". Expected an embedded resource translations/English.json or translations/English.yml."); } Dictionary<string, string> dictionary2 = new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(Encoding.UTF8.GetString(array)); if (dictionary2 == null) { throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Localization file was empty."); } string text2 = null; if (language != "English") { if (dictionary.ContainsKey(language)) { text2 = File.ReadAllText(dictionary[language]); } else { byte[] array2 = LoadTranslationFromAssembly(language); if (array2 != null) { text2 = Encoding.UTF8.GetString(array2); } } } if (text2 == null && dictionary.ContainsKey("English")) { text2 = File.ReadAllText(dictionary["English"]); } if (text2 != null) { foreach (KeyValuePair<string, string> item2 in new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(text2) ?? new Dictionary<string, string>()) { dictionary2[item2.Key] = item2.Value; } } loadedTexts[language] = dictionary2; foreach (KeyValuePair<string, string> item3 in dictionary2) { UpdatePlaceholderText(__instance, item3.Key); } } static Localizer() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown PlaceholderProcessors = new Dictionary<string, Dictionary<string, Func<string>>>(); loadedTexts = new Dictionary<string, Dictionary<string, string>>(); localizationLanguage = new ConditionalWeakTable<Localization, string>(); localizationObjects = new List<WeakReference<Localization>>(); fileExtensions = new List<string> { ".json", ".yml" }; Harmony val = new Harmony("org.bepinex.helpers.LocalizationManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalization", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } private static byte[] LoadTranslationFromAssembly(string language) { foreach (string fileExtension in fileExtensions) { byte[] array = ReadEmbeddedFileBytes("translations." + language + fileExtension); if (array != null) { return array; } } return null; } public static byte[] ReadEmbeddedFileBytes(string resourceFileName, Assembly containingAssembly = null) { using MemoryStream memoryStream = new MemoryStream(); if ((object)containingAssembly == null) { containingAssembly = Assembly.GetCallingAssembly(); } string text = containingAssembly.GetManifestResourceNames().FirstOrDefault((string str) => str.EndsWith(resourceFileName, StringComparison.Ordinal)); if (text != null) { containingAssembly.GetManifestResourceStream(text)?.CopyTo(memoryStream); } return (memoryStream.Length == 0L) ? null : memoryStream.ToArray(); } } } namespace TerrainHoe { [PublicAPI] public static class API { public static Biome GetBiome(Vector3 position) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (!TerrainColors.TryFindTerrainColors(position, out var instance) || !instance.m_initialized) { return WorldGenerator.instance.GetBiome(position); } return instance.GetBiome(instance.m_terrainComp.m_hmap, position); } public static Biome GetHeightmapBiome(Heightmap hmap, Vector3 position) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) if (!TerrainColors.TryFindTerrainColors(position, out var instance) || !instance.m_initialized) { return hmap.GetBiome(position, 0.02f, false); } return instance.GetBiome(hmap, position); } } public static class TerrainHoe_API { private const string Namespace = "TerrainHoe"; private const string ClassName = "API"; private const string Assembly = "TerrainHoe"; private const string TypeNameAssembly = "TerrainHoe.API, TerrainHoe"; private static readonly bool isLoaded; private static readonly MethodInfo API_GetBiome; private static readonly MethodInfo API_GetHeightmapBiome; public static bool IsLoaded() { return isLoaded; } static TerrainHoe_API() { isLoaded = false; Type type = Type.GetType("TerrainHoe.API, TerrainHoe"); if (!(type == null)) { isLoaded = true; API_GetBiome = type.GetMethod("GetBiome", BindingFlags.Static | BindingFlags.Public); API_GetHeightmapBiome = type.GetMethod("GetHeightmapBiome", BindingFlags.Static | BindingFlags.Public); } } public static Biome GetBiome(Vector3 position) { //IL_000e: 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) return (Biome)(API_GetBiome.Invoke(null, new object[1] { position }) ?? ((object)(Biome)0)); } public static Biome GetBiome(Heightmap heightmap, Vector3 position) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) return (Biome)(API_GetHeightmapBiome.Invoke(null, new object[2] { heightmap, position }) ?? ((object)heightmap.GetBiome(position, 0.02f, false))); } } public static class SpriteManager { private static readonly MethodInfo LoadImage; private static readonly Dictionary<string, Sprite> sprites; static SpriteManager() { LoadImage = AccessTools.Method(typeof(ImageConversion), "LoadImage", new Type[2] { typeof(Texture2D), typeof(byte[]) }, (Type[])null); sprites = new Dictionary<string, Sprite>(); } public static Sprite GetSprite(string fileName, string folderName = "icons") { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) if (sprites.TryGetValue(fileName, out var value)) { return value; } Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = "TerrainHoe." + folderName + "." + fileName; using Stream stream = executingAssembly.GetManifestResourceStream(name); if (stream == null) { return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); Texture2D val = new Texture2D(2, 2); value = (val.LoadImage4x(array) ? Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), Vector2.zero) : null); if ((Object)(object)value != (Object)null) { ((Object)value).name = fileName; sprites.Add(fileName, value); return value; } throw new Exception("Invalid sprite file: " + fileName); } public static bool LoadImage4x(this Texture2D tex, byte[] data) { return (bool)LoadImage.Invoke(null, new object[2] { tex, data }); } } public enum Toggle { On = 1, Off = 0 } public static class ConfigManager { private const string ConfigFileName = "RustyMods.TerrainHoe.cfg"; private static readonly string ConfigFileFullPath; public static readonly ConfigSync ConfigSync; private static readonly ISerializer serializer; private static readonly IDeserializer deserializer; public static readonly string ConfigFolderPath; public static object configManager; private static ConfigEntry<Toggle> _serverConfigLocked; static ConfigManager() { _serverConfigLocked = null; string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + "RustyMods.TerrainHoe.cfg"; ConfigSync = new ConfigSync("RustyMods.TerrainHoe") { DisplayName = "TerrainHoe", CurrentVersion = "1.0.2", MinimumRequiredVersion = "1.0.2" }; serializer = new SerializerBuilder().ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitNull | DefaultValuesHandling.OmitDefaults | DefaultValuesHandling.OmitEmptyCollections).DisableAliases().Build(); deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build(); ConfigFolderPath = Path.Combine(Paths.ConfigPath, "TerrainHoe"); } public static void Start() { _serverConfigLocked = config("1 - General", "Lock Configuration", Toggle.On, "If on, the configuration is locked and can be changed by server admins only."); ConfigSync.AddLockingConfigEntry<Toggle>(_serverConfigLocked); SetupWatcher(); } public static T Deserialize<T>(string data) { return deserializer.Deserialize<T>(data); } public static string Serialize<T>(T obj) { if (obj == null) { return ""; } using StringWriter stringWriter = new StringWriter(); serializer.Serialize(stringWriter, obj, obj.GetType()); return stringWriter.ToString(); } public static void OnFejdStartup() { Type type = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "ConfigurationManager")?.GetType("ConfigurationManager.ConfigurationManager"); configManager = ((type == null) ? null : Chainloader.ManagerObject.GetComponent(type)); } public static string GetFolderPath() { if (!Directory.Exists(ConfigFolderPath)) { Directory.CreateDirectory(ConfigFolderPath); } return ConfigFolderPath; } private static void SetupWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, "RustyMods.TerrainHoe.cfg"); fileSystemWatcher.Changed += ReadConfigValues; fileSystemWatcher.Created += ReadConfigValues; fileSystemWatcher.Renamed += ReadConfigValues; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; } private static void ReadConfigValues(object sender, FileSystemEventArgs e) { if (!File.Exists(ConfigFileFullPath)) { return; } try { TerrainHoe.LogDebug("ReadConfigValues called"); ((BaseUnityPlugin)TerrainHoe.instance).Config.Reload(); } catch { TerrainHoe.LogError("There was an issue loading your RustyMods.TerrainHoe.cfg"); TerrainHoe.LogError("Please check your config entries for spelling and format!"); } } public static ConfigEntry<T> config<T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags); ConfigEntry<T> val2 = ((BaseUnityPlugin)TerrainHoe.instance).Config.Bind<T>(group, name, value, val); SyncedConfigEntry<T> syncedConfigEntry = ConfigSync.AddConfigEntry<T>(val2); syncedConfigEntry.SynchronizedConfig = synchronizedSetting; return val2; } public static ConfigEntry<T> config<T>(string group, string name, T value, string description, bool synchronizedSetting = true) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting); } } public class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [<18f04136-86b9-4dc0-a7a0-ae8e922ae27f>Nullable(2)] [UsedImplicitly] public string Category; [<18f04136-86b9-4dc0-a7a0-ae8e922ae27f>Nullable(new byte[] { 2, 1 })] [UsedImplicitly] public Action<ConfigEntryBase> CustomDrawer; } [Serializable] public struct Requirement { public string itemName; public int amount; public bool recover; public Requirement() { itemName = ""; amount = 1; recover = false; } public Requirement(string itemName, int amount = 1, bool recover = true) { this.itemName = itemName; this.amount = amount; this.recover = recover; } } public class PieceRequirements { public readonly List<Requirement> Requirements; public static readonly ConfigurationManagerAttributes attributes = new ConfigurationManagerAttributes { CustomDrawer = DrawConfigTable }; public PieceRequirements(List<Requirement> reqs) { Requirements = reqs; } public PieceRequirements(params Requirement[] reqs) { Requirements = reqs.ToList(); } public PieceRequirements(Requirement[] reqs) { Requirements = new List<Requirement>(); foreach (Requirement val in reqs) { Requirements.Add(new Requirement { itemName = ((Object)val.m_resItem).name, amount = val.m_amount, recover = val.m_recover }); } } public PieceRequirements(string reqs) { Requirements = reqs.Split(new char[1] { ';' }).Select(delegate(string r) { string[] parts = r.Split(new char[1] { ',' }); return new Requirement { itemName = parts.GetString(0), amount = parts.GetInt(1, 1), recover = parts.GetBool(2, defaultValue: true) }; }).ToList(); } public Requirement[] ToPieceRequirement(string requester = "") { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown Dictionary<string, Requirement> dictionary = new Dictionary<string, Requirement>(); for (int i = 0; i < Requirements.Count; i++) { Requirement requirement = Requirements[i]; if (!string.IsNullOrEmpty(requirement.itemName)) { ItemDrop itemDrop = requirement.itemName.GetItemDrop(requester); if (!((Object)(object)itemDrop == (Object)null)) { dictionary[requirement.itemName] = new Requirement { m_amount = requirement.amount, m_recover = requirement.recover, m_resItem = itemDrop }; } } } return dictionary.Values.ToArray(); } public override string ToString() { return string.Join(";", Requirements.Select((Requirement r) => $"{r.itemName},{r.amount},{r.recover}")); } public string ToCustomString() { return string.Join(";", Requirements.Select((Requirement r) => $"{r.itemName},{r.amount}")); } private static void DrawConfigTable(ConfigEntryBase cfg) { //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Expected O, but got Unknown //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Expected O, but got Unknown //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Expected O, but got Unknown bool valueOrDefault = cfg.Description.Tags.Select((object a) => (a.GetType().Name == "ConfigurationManagerAttributes") ? ((bool?)a.GetType().GetField("ReadOnly")?.GetValue(a)) : null).FirstOrDefault((bool? v) => v.HasValue).GetValueOrDefault(); List<Requirement> requirements = new PieceRequirements((string)cfg.BoxedValue).Requirements; List<Requirement> list = new List<Requirement>(); bool flag = false; GUILayout.BeginVertical(Array.Empty<GUILayoutOption>()); foreach (Requirement item in requirements) { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); int num = item.amount; if (int.TryParse(GUILayout.TextField(num.ToString(), new GUIStyle(GUI.skin.textField) { fixedWidth = 40f }, Array.Empty<GUILayoutOption>()), out var result) && result != num && !valueOrDefault) { num = result; flag = true; } string text = GUILayout.TextField(item.itemName, new GUIStyle(GUI.skin.textField), Array.Empty<GUILayoutOption>()); string text2 = (valueOrDefault ? item.itemName : text); flag = flag || text2 != item.itemName; bool flag2 = item.recover; if (GUILayout.Toggle(item.recover, "Recover", new GUIStyle(GUI.skin.toggle) { fixedWidth = 67f }, Array.Empty<GUILayoutOption>()) != item.recover) { flag2 = !flag2; flag = true; } if (GUILayout.Button("x", new GUIStyle(GUI.skin.button) { fixedWidth = 21f }, Array.Empty<GUILayoutOption>()) && !valueOrDefault) { flag = true; } else { list.Add(new Requirement { amount = num, itemName = text2, recover = flag2 }); } if (GUILayout.Button("+", new GUIStyle(GUI.skin.button) { fixedWidth = 21f }, Array.Empty<GUILayoutOption>()) && !valueOrDefault) { flag = true; list.Add(new Requirement { amount = 1, itemName = "", recover = false }); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); if (flag) { cfg.BoxedValue = new PieceRequirements(list).ToString(); } } } public static class Extensions { public static ItemDrop GetItemDrop(this string name, string requester = "") { GameObject prefab = PrefabManager.GetPrefab(name); ItemDrop val = ((prefab != null) ? prefab.GetComponent<ItemDrop>() : null); if ((Object)(object)val == (Object)null) { if (!string.IsNullOrEmpty(requester)) { TerrainHoe.LogWarning("[ " + requester + " ] The requirement item '" + name + "' does not exist."); } else { TerrainHoe.LogWarning("The requirement item '" + name + "' does not exist."); } } return val; } public static int GetInt(this string[] parts, int index, int defaultValue = 0) { if (parts.Length - 1 < index) { return defaultValue; } int result; return int.TryParse(parts[index].Trim(), out result) ? result : 0; } public static float GetFloat(this string[] parts, int index, float defaultValue = 0f) { if (parts.Length - 1 < index) { return defaultValue; } float result; return float.TryParse(parts[index].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture, out result) ? result : defaultValue; } public static bool GetBool(this string[] parts, int index, bool defaultValue = false) { if (parts.Length - 1 < index) { return defaultValue; } bool result; return bool.TryParse(parts[index].Trim(), out result) ? result : defaultValue; } public static string GetString(this string[] parts, int index, string defaultValue = "") { if (parts.Length - 1 < index) { return defaultValue; } return parts[index].Trim(); } } public static class PrefabManager { [HarmonyPatch(typeof(FejdStartup), "Awake")] public static class FejdStartup_Awake_Patch { private static void Prefix(FejdStartup __instance) { _ZNetScene = __instance.m_objectDBPrefab.GetComponent<ZNetScene>(); TerrainHoe.OnFejdStartup(); ConfigManager.OnFejdStartup(); } } [HarmonyPatch(typeof(ZNetScene), "Awake")] private static class ZNetScene_Awake_Patch { private static void Postfix() { Localizer.Load(); } } private static ZNetScene _ZNetScene; private static readonly GameObject root; public static Transform transform => root.transform; static PrefabManager() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown root = new GameObject("root"); Object.DontDestroyOnLoad((Object)(object)root); root.SetActive(false); } internal static GameObject GetPrefab(string prefabName) { if ((Object)(object)ZNetScene.instance != (Object)null) { GameObject prefab = ZNetScene.instance.GetPrefab(prefabName); if ((Object)(object)prefab != (Object)null) { return prefab; } } if ((Object)(object)_ZNetScene != (Object)null) { GameObject prefab = _ZNetScene.m_prefabs.Find((GameObject p) => ((Object)p).name == prefabName); if ((Object)(object)prefab != (Object)null) { return prefab; } } return null; } } [BepInPlugin("RustyMods.TerrainHoe", "TerrainHoe", "1.0.2")] public class TerrainHoe : BaseUnityPlugin { public const string ModName = "TerrainHoe"; public const string ModVersion = "1.0.2"; public const string Author = "RustyMods"; public const string ModGUID = "RustyMods.TerrainHoe"; public static string ConnectionError = ""; public readonly Harmony _harmony = new Harmony("RustyMods.TerrainHoe"); public static TerrainHoe instance; private static bool toolsLoaded; public void Awake() { instance = this; ConfigManager.Start(); PaintMan.Init(); Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); } public static void OnFejdStartup() { if (!toolsLoaded) { new Lava("piece_paint_lava", "$piece_lava"); new AshlandsGrass("piece_paint_ashlands_grass", "$piece_ashlands_grass"); new PavedGrass("piece_paint_paved_grass", "$piece_paved_grass"); new PavedDark("piece_paint_paved_cultivated", "$piece_paved_dark"); new MistlandsGrass("piece_paint_mistlands", "$piece_mistlands_grass"); new MistlandsDirt("piece_paint_mistlands_dirt", "$piece_mistlands_dirt"); new BlackForestGrass("piece_paint_blackforest_grass", "$piece_blackforest_grass"); new PlainsGrass("piece_paint_plains_grass", "$piece_plains_grass"); new Snow("piece_paint_snow", "$piece_snow"); new SwampGrass("piece_paint_swamp_grass", "$piece_swamp_grass"); new MeadowsGrass("piece_paint_meadows_grass", "$piece_meadows_grass"); new Reset("piece_paint_reset", "$piece_reset_all"); toolsLoaded = true; } } public static void LogDebug(string msg) { ((BaseUnityPlugin)instance).Logger.LogDebug((object)msg); } public static void LogError(string msg) { ((BaseUnityPlugin)instance).Logger.LogError((object)msg); } public static void LogWarning(string msg) { ((BaseUnityPlugin)instance).Logger.LogWarning((object)msg); } public static void LogInfo(string msg) { ((BaseUnityPlugin)instance).Logger.LogInfo((object)msg); } public static void LogFatal(string msg) { ((BaseUnityPlugin)instance).Logger.LogFatal((object)msg); } } public static class PaintMan { [HarmonyPatch(typeof(Player), "SetupPlacementGhost")] private static class Player_SetupPlacementGhost_Patch { private static void Postfix(Player __instance) { Piece val = default(Piece); if (!((Object)(object)__instance.m_placementGhost == (Object)null) && __instance.m_placementGhost.TryGetComponent<Piece>(ref val) && IPaint.TryGetPaintTool(val.m_name, out var _)) { __instance.m_placementGhost.AddComponent<PaintOptions>(); } } } [HarmonyPatch(typeof(Hud), "SetupPieceInfo")] private static class Hud_SetupPieceInfo_Patch { private static void Postfix(Hud __instance, Piece piece) { if (!((Object)(object)piece == (Object)null) && IPaint.IsPaintTool(piece) && (Object)(object)PaintOptions.instance != (Object)null) { __instance.m_pieceDescription.text = PaintOptions.instance.m_pieceInfo; } } } private static readonly Dictionary<string, PaintType> paintTypes; private static readonly Dictionary<PaintType, string> customPaintTypes; static PaintMan() { paintTypes = new Dictionary<string, PaintType>(); customPaintTypes = new Dictionary<PaintType, string>(); } public static void Init() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Expected O, but got Unknown //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Expected O, but got Unknown //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Expected O, but got Unknown //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Expected O, but got Unknown //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Expected O, but got Unknown //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Expected O, but got Unknown //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Expected O, but got Unknown //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Expected O, but got Unknown //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Expected O, but got Unknown Harmony harmony = TerrainHoe.instance._harmony; harmony.Patch((MethodBase)AccessTools.Method(typeof(Enum), "GetValues", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_Enum_GetValues", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(Enum), "GetNames", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_Enum_GetNames", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(Enum), "GetName", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_Enum_GetName", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(TerrainComp), "PaintCleared", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_TerrainComp_PaintCleared", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(TerrainComp), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_TerrainComp_Awake", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(TerrainComp), "Initialize", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_TerrainComp_Initialize", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(TerrainComp), "Save", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_TerrainComp_Save", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(TerrainComp), "Load", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_TerrainComp_Load", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(Heightmap), "RebuildRenderMesh", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Transpile_Heightmap_RebuildRenderMesh", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(ClutterSystem), "GetPatchBiomes", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_ClutterSystem_GetPatchBiomes", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(ClutterSystem), "GetGroundInfo", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_ClutterSystem_GetGroundInfo", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); harmony.Patch((MethodBase)AccessTools.Method(typeof(Character), "UpdateLava", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(PaintMan), "Patch_Character_UpdateLava", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } public static bool TryGetPaintType(string name, out PaintType paintType) { if (Enum.TryParse<PaintType>(name, ignoreCase: true, out paintType)) { return true; } if (paintTypes.TryGetValue(name, out paintType)) { return true; } return false; } public static PaintType GetPaintType(string name) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) if (Enum.TryParse<PaintType>(name, ignoreCase: true, out PaintType result)) { return result; } if (paintTypes.TryGetValue(name, out result)) { return result; } Dictionary<PaintType, string> dictionary = GetPaintTypes(); foreach (KeyValuePair<PaintType, string> item in dictionary) { if (item.Value != name) { continue; } result = item.Key; paintTypes[name] = result; return result; } result = (PaintType)StringExtensionMethods.GetStableHashCode(name); paintTypes[name] = result; customPaintTypes[result] = name; return result; } private static Dictionary<PaintType, string> GetPaintTypes() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) Array values = Enum.GetValues(typeof(PaintType)); string[] names = Enum.GetNames(typeof(PaintType)); Dictionary<PaintType, string> dictionary = new Dictionary<PaintType, string>(); for (int i = 0; i < values.Length; i++) { dictionary[(PaintType)values.GetValue(i)] = names[i]; } foreach (KeyValuePair<PaintType, string> customPaintType in customPaintTypes) { dictionary[customPaintType.Key] = customPaintType.Value; } return dictionary; } private static void Patch_Enum_GetValues(Type enumType, ref Array __result) { if (!(enumType != typeof(PaintType)) && paintTypes.Count != 0) { PaintType[] array = (PaintType[])(object)new PaintType[__result.Length + paintTypes.Count]; __result.CopyTo(array, 0); paintTypes.Values.CopyTo(array, __result.Length); __result = array; } } private static bool Patch_Enum_GetName(Type enumType, object value, ref string __result) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (enumType != typeof(PaintType)) { return true; } if (customPaintTypes.TryGetValue((PaintType)value, out var value2)) { __result = value2; return false; } return true; } private static void Patch_Enum_GetNames(Type enumType, ref string[] __result) { if (!(enumType != typeof(PaintType)) && paintTypes.Count != 0) { __result = CollectionExtensions.AddRangeToArray<string>(__result, paintTypes.Keys.ToArray()); } } private static bool Patch_TerrainComp_PaintCleared(TerrainComp __instance, Vector3 worldPos, float radius, PaintType paintType, bool heightCheck, bool apply) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) if (!IPaint.TryGetPaintTool(paintType, out var paintTool)) { return true; } TerrainColors component = ((Component)__instance).GetComponent<TerrainColors>(); worldPos.x -= 0.5f; worldPos.z -= 0.5f; float heightOffset = worldPos.y - ((Component)__instance).transform.position.y; int num = default(int); int num2 = default(int); __instance.m_hmap.WorldToVertexMask(worldPos, ref num, ref num2); float num3 = radius / __instance.m_hmap.m_scale; int num4 = Mathf.CeilToInt(num3); Vector2 centerVertex = default(Vector2); ((Vector2)(ref centerVertex))..ctor((float)num, (float)num2); for (int i = num2 - num4; i <= num2 + num4; i++) { UpdatePaints(__instance, component, paintTool, centerVertex, num, num4, i, heightCheck, heightOffset, num3); } return false; } private static void UpdatePaints(TerrainComp comp, TerrainColors terrainColors, IPaint paint, Vector2 centerVertex, int centerVertex_x, int vertexSearchRadius, int vertex_y, bool heightCheck, float heightOffset, float radiusInVertices) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) for (int i = centerVertex_x - vertexSearchRadius; i <= centerVertex_x + vertexSearchRadius; i++) { UpdatePaint(comp, terrainColors, paint, Vector2.op_Implicit(centerVertex), i, vertex_y, heightCheck, heightOffset, radiusInVertices); } } private static void UpdatePaint(TerrainComp comp, TerrainColors terrainColors, IPaint paint, Vector3 centerVertex, int vertex_x, int vertex_y, bool heightCheck, float heightOffset, float radiusInVertices) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: 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) float distanceFromCenter = Vector2.Distance(Vector2.op_Implicit(centerVertex), new Vector2((float)vertex_x, (float)vertex_y)); int num = comp.m_width + 1; bool flag = vertex_x >= 0 && vertex_y >= 0 && vertex_x < num && vertex_y < num; bool flag2 = !heightCheck || comp.m_hmap.GetHeight(vertex_x, vertex_y) <= heightOffset; if (flag && flag2) { int num2 = vertex_y * num + vertex_x; PaintMask(comp, paint, num2, vertex_x, vertex_y, distanceFromCenter, radiusInVertices); PaintTerrain(terrainColors, paint, num2, vertex_x, vertex_y, distanceFromCenter, radiusInVertices); if (paint.reset) { comp.m_modifiedHeight[num2] = false; comp.m_levelDelta[num2] = 0f; comp.m_smoothDelta[num2] = 0f; } } } private static void PaintMask(TerrainComp comp, IPaint paint, int index, int vertex_x, int vertex_y, float distanceFromCenter, float radiusInVertices) { //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_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) if (paint.reset) { comp.m_modifiedPaint[index] = false; comp.m_paintMask[index] = new Color(0f, 0f, 0f, 1f); return; } Color paintMask = comp.m_hmap.GetPaintMask(vertex_x, vertex_y); Color val; if (paint.blend) { float num = Mathf.Pow(1f - Mathf.Clamp01(distanceFromCenter / radiusInVertices), 0.1f); float a = paintMask.a; val = Color.Lerp(paintMask, paint.GetColor(), num); if (!paint.overrideAlpha) { val.a = a; } } else { val = paint.GetColor(); if (!paint.overrideAlpha) { val.a = paintMask.a; } } comp.m_modifiedPaint[index] = true; comp.m_paintMask[index] = val; } private static void PaintTerrain(TerrainColors colors, IPaint paint, int index, int vertex_x, int vertex_y, float distanceFromCenter, float radiusInVertices) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) if (!paint.isBiomePaint || (Object)(object)colors == (Object)null) { return; } if (paint.reset) { colors.ResetTerrain(index); return; } Color32 color; if (paint.blendTerrain) { float num = Mathf.Pow(1f - Mathf.Clamp01(distanceFromCenter / radiusInVertices), 0.1f); Color32 currentBiomeColor = colors.GetCurrentBiomeColor(index, vertex_x, vertex_y); color = Color32.Lerp(currentBiomeColor, paint.GetBiomeColor(), num); } else { color = paint.GetBiomeColor(); } colors.SetBiomeColor(index, color); } private static void Patch_TerrainComp_Awake(TerrainComp __instance) { ((Component)__instance).gameObject.AddComponent<TerrainColors>(); } private static void Patch_TerrainComp_Initialize(TerrainComp __instance) { ((Component)__instance).GetComponent<TerrainColors>()?.Initialize(); } private static void Patch_TerrainComp_Save(TerrainComp __instance) { ((Component)__instance).GetComponent<TerrainColors>()?.Save(); } private static void Patch_TerrainComp_Load(TerrainComp __instance) { ((Component)__instance).GetComponent<TerrainColors>()?.Load(); } private static IEnumerable<CodeInstruction> Transpile_Heightmap_RebuildRenderMesh(IEnumerable<CodeInstruction> instructions) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown MethodInfo methodInfo = AccessTools.Method(typeof(Mesh), "GetVertices", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(PaintMan), "Apply_TerrainColor_Modifiers", (Type[])null, (Type[])null); CodeInstruction[] array = (CodeInstruction[])(object)new CodeInstruction[2] { new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Call, (object)methodInfo2) }; return new CodeMatcher(instructions, (ILGenerator)null).Start().MatchStartForward((CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Callvirt, (object)methodInfo, (string)null) }).Insert(array) .InstructionEnumeration(); } private static void Apply_TerrainColor_Modifiers(Heightmap heightmap) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) if (heightmap.m_isDistantLod || !TerrainColors.TryFindTerrainColors(((Component)heightmap).transform.position, out var instance) || !instance.m_initialized) { return; } int num = heightmap.m_width + 1; for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { int num2 = i * num + j; if (instance.m_modifiedTerrain[num2]) { Color32 value = instance.m_terrainMask[num2]; Heightmap.s_tempColors[num2] = value; } } } } private static Biome GetBiomeFromMesh(this Heightmap hm, Vector3 point, float oceanLevel = 0.02f, bool waterAlwaysOcean = false) { //IL_002f: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) if (hm.m_isDistantLod || waterAlwaysOcean) { return WorldGenerator.instance.GetBiome(point.x, point.z, oceanLevel, waterAlwaysOcean); } if (!TerrainColors.TryFindTerrainColors(((Component)hm).transform.position, out var instance)) { return hm.GetBiome(point, 0.02f, false); } return instance.GetBiome(hm, point); } private static Biome FindBiomeClutterByMesh(Vector3 point) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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) //IL_004d: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)ZoneSystem.instance) && !ZoneSystem.instance.IsZoneLoaded(point)) { return (Biome)0; } Heightmap val = Heightmap.FindHeightmap(point); if ((Object)(object)val == (Object)null) { return (Biome)0; } return val.GetBiomeFromMesh(point); } private static Biome GetPatchBiomesByMesh(Vector3 center, float halfSize) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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_009e: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Invalid comparison between Unknown and I4 //IL_00a8: Unknown result type (might be due to invalid IL or missing references) Biome val = FindBiomeClutterByMesh(new Vector3(center.x - halfSize, 0f, center.z - halfSize)); Biome val2 = FindBiomeClutterByMesh(new Vector3(center.x + halfSize, 0f, center.z - halfSize)); Biome val3 = FindBiomeClutterByMesh(new Vector3(center.x - halfSize, 0f, center.z + halfSize)); Biome val4 = FindBiomeClutterByMesh(new Vector3(center.x - halfSize, 0f, center.z + halfSize)); if ((int)val == 0 || (int)val2 == 0 || (int)val3 == 0 || (int)val4 == 0) { return (Biome)0; } return (Biome)(val | val2 | val4 | val3); } private static bool GetGroundInfoByMesh(this ClutterSystem cs, Vector3 p, out Vector3 point, out Vector3 normal, out Heightmap hmap, out Biome biome) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: 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_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected I4, but got Unknown Vector3 val = p + Vector3.up * 500f; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, Vector3.down, ref val2, 1000f, cs.m_placeRayMask)) { point = ((RaycastHit)(ref val2)).point; normal = ((RaycastHit)(ref val2)).normal; hmap = ((Component)((RaycastHit)(ref val2)).collider).GetComponent<Heightmap>(); biome = (Biome)(int)hmap.GetBiomeFromMesh(point); return true; } point = p; normal = Vector3.up; hmap = null; biome = (Biome)0; return false; } private static bool Patch_ClutterSystem_GetPatchBiomes(Vector3 center, float halfSize, ref Biome __result) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected I4, but got Unknown __result = (Biome)(int)GetPatchBiomesByMesh(center, halfSize); return (int)__result == 0; } private static bool Patch_ClutterSystem_GetGroundInfo(ClutterSystem __instance, Vector3 p, out Vector3 point, out Vector3 normal, out Heightmap hmap, out Biome biome, ref bool __result) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) __result = __instance.GetGroundInfoByMesh(p, out point, out normal, out hmap, out biome); return (int)biome == 0; } private static void Patch_Character_UpdateLava(Character __instance, float dt) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: 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_009f: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) if (__instance.m_tolerateFire || !TerrainColors.TryFindTerrainColors(((Component)__instance).transform.position, out var instance) || !instance.m_initialized) { return; } int num = default(int); int num2 = default(int); instance.m_terrainComp.m_hmap.WorldToVertex(((Component)__instance).transform.position, ref num, ref num2); int num3 = num2 * (instance.m_width + 1) + num; if (!instance.m_modifiedTerrain[num3]) { if (!WorldGenerator.IsAshlands(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.z)) { __instance.m_lavaHeatLevel -= dt * __instance.m_heatCooldownBase; } } else { Color32 val = instance.m_terrainMask[num3]; Color val2 = instance.m_terrainComp.m_paintMask[num3]; if (val.r > 200 && val.a > 200 && val2.a > 0.6f) { __instance.m_lavaHeatLevel += dt * __instance.m_heatBuildupBase * (1f - __instance.GetEquipmentHeatResistanceModifier()); } else { __instance.m_lavaHeatLevel -= dt * __instance.m_heatCooldownBase; } } __instance.m_lavaHeatLevel = Mathf.Clamp(__instance.m_lavaHeatLevel, 0f, 1f); } } public class AshlandsGrass : IPaint { public AshlandsGrass(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("AshlandsGrass"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; overrideAlpha = true; piece.m_icon = SpriteManager.GetSprite("ashlands_grass_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0f, 0f); } public override Color32 GetBiomeColor() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) return new Color32(byte.MaxValue, (byte)0, (byte)0, byte.MaxValue); } public override Biome GetBiome() { return (Biome)32; } } public class BlackForestGrass : IPaint { public BlackForestGrass(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("BlackForestGrass"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; piece.m_icon = SpriteManager.GetSprite("forest_grass_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0f, 1f); } public override Color32 GetBiomeColor() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) return new Color32((byte)0, (byte)0, byte.MaxValue, (byte)0); } public override Biome GetBiome() { return (Biome)8; } } public static class PaintVars { public static readonly int TerrainColors = StringExtensionMethods.GetStableHashCode("TerrainHoe.Paint.BiomeColors"); } public abstract class IPaint { [HarmonyPatch(typeof(Player), "OnSpawned")] private static class Player_OnSpawned { private static void Postfix() { foreach (IPaint value in m_paintTools.Values) { value.OnRecipeChange(null, null); } } } public static readonly Dictionary<Piece, IPaint> m_paintTools = new Dictionary<Piece, IPaint>(); private static readonly Dictionary<PaintType, IPaint> m_paintMask = new Dictionary<PaintType, IPaint>(); private static readonly Dictionary<string, IPaint> m_paintToolNamed = new Dictionary<string, IPaint>(); protected readonly Piece piece; public readonly TerrainOp terrainOp; public bool adminOnly; public bool overrideAlpha = true; public bool blend = true; public bool isBiomePaint; public bool blendTerrain = true; public bool reset; private readonly ConfigEntry<string> recipe; public static bool IsPaintTool(Piece piece) { return m_paintTools.ContainsKey(piece); } public static bool TryGetPaintTool(PaintType type, out IPaint paintTool) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return m_paintMask.TryGetValue(type, out paintTool); } public static bool TryGetPaintTool(Piece piece, out IPaint paintTool) { return m_paintTools.TryGetValue(piece, out paintTool); } public static bool TryGetPaintTool(string name, out IPaint paintTool) { return m_paintToolNamed.TryGetValue(name, out paintTool); } protected IPaint(string id, string name, PaintType type, int index = 1) { //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Expected O, but got Unknown //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) ItemDrop component = PrefabManager.GetPrefab("Cultivator").GetComponent<ItemDrop>(); List<GameObject> pieces = component.m_itemData.m_shared.m_buildPieces.m_pieces; GameObject val = pieces[1]; GameObject val2 = Object.Instantiate<GameObject>(val.gameObject, PrefabManager.transform); ((Object)val2).name = id; piece = val2.GetComponent<Piece>(); piece.m_name = name; piece.m_description = name + "_desc"; piece.m_vegetationGroundOnly = false; piece.m_category = (PieceCategory)0; terrainOp = val2.GetComponent<TerrainOp>(); terrainOp.m_settings.m_paintType = type; terrainOp.m_settings.m_level = false; terrainOp.m_settings.m_smooth = false; terrainOp.m_settings.m_raise = false; terrainOp.m_settings.m_smoothPower = 0f; recipe = ConfigManager.config(id, "Cost", "", new ConfigDescription("Define tool requirements", (AcceptableValueBase)null, new object[1] { PieceRequirements.attributes })); recipe.SettingChanged += OnRecipeChange; piece.m_resources = new PieceRequirements(recipe.Value).ToPieceRequirement(); m_paintTools[piece] = this; m_paintMask[type] = this; m_paintToolNamed[piece.m_name] = this; terrainOp.m_settings.m_paintRadius = 5f; GameObject prefab = PrefabManager.GetPrefab("dverger_guardstone"); PrivateArea component2 = prefab.GetComponent<PrivateArea>(); GameObject gameObject = ((Component)component2.m_areaMarker).gameObject; GameObject val3 = Object.Instantiate<GameObject>(gameObject, ((Component)piece).transform); val3.transform.localPosition = Vector3.zero; val3.transform.localRotation = Quaternion.identity; ((Object)val3).name = "projector"; val3.SetActive(true); component.m_itemData.m_shared.m_buildPieces.m_pieces.Insert(index, val2); } public void OnRecipeChange(object sender, EventArgs e) { piece.m_resources = new PieceRequirements(recipe.Value).ToPieceRequirement(); } public abstract Color GetColor(); public virtual Color32 GetBiomeColor() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return default(Color32); } public virtual Biome GetBiome() { return (Biome)0; } } public class Lava : IPaint { public Lava(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("Lava"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; overrideAlpha = true; piece.m_icon = SpriteManager.GetSprite("lava_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0f, 1f); } public override Color32 GetBiomeColor() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) return new Color32(byte.MaxValue, (byte)0, (byte)0, byte.MaxValue); } public override Biome GetBiome() { return (Biome)32; } } public class MeadowsGrass : IPaint { public MeadowsGrass(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("MeadowsGrass"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; piece.m_icon = SpriteManager.GetSprite("grass_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0f, 1f); } public override Color32 GetBiomeColor() { //IL_0004: Unknown result type (might be due to invalid IL or missing references) return new Color32((byte)0, (byte)0, (byte)0, (byte)0); } public override Biome GetBiome() { return (Biome)1; } } public class MistlandsGrass : IPaint { public MistlandsGrass(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("Mistlands"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; piece.m_icon = SpriteManager.GetSprite("grass_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0f, 1f); } public override Color32 GetBiomeColor() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) return new Color32((byte)0, (byte)0, byte.MaxValue, byte.MaxValue); } public override Biome GetBiome() { return (Biome)512; } } public class MistlandsDirt : IPaint { public MistlandsDirt(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("MistlandsDirt"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; piece.m_icon = SpriteManager.GetSprite("mistlands_dirt_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(1f, 0f, 0f, 0f); } public override Color32 GetBiomeColor() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) return new Color32((byte)0, (byte)0, byte.MaxValue, byte.MaxValue); } public override Biome GetBiome() { return (Biome)512; } } public class PaintOptions : MonoBehaviour { public static PaintOptions instance; public Piece m_piece; public float radius; public ParticleSystem m_ring; public ParticleSystem m_particles; public CircleProjector projector; private IPaint m_tool; public string m_pieceInfo = ""; private float m_minRadius = 5f; private float m_maxRadius = 20f; private float m_maxSmooth = 10f; private float m_maxRaiseDelta = 20f; public void Awake() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) TerrainOp val = default(TerrainOp); if (!((Component)this).TryGetComponent<TerrainOp>(ref val) || !IPaint.TryGetPaintTool(val.m_settings.m_paintType, out m_tool)) { TerrainHoe.LogWarning("Invalid paint tool"); Object.Destroy((Object)(object)this); } m_piece = ((Component)this).GetComponent<Piece>(); radius = m_tool.terrainOp.m_settings.m_paintRadius; m_ring = ((Component)((Component)this).transform.Find("_GhostOnly")).GetComponent<ParticleSystem>(); m_particles = ((Component)((Component)this).transform.Find("_GhostOnly/particles")).GetComponent<ParticleSystem>(); projector = ((Component)this).GetComponentInChildren<CircleProjector>(true); projector.m_radius = radius; projector.m_mask = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { "terrain" })); projector.m_nrOfSegments = Mathf.CeilToInt(radius / 2f); UpdateHudPieceInfo(); instance = this; } public void OnDestroy() { if ((Object)(object)instance == (Object)(object)this) { instance = null; } } public void FixedUpdate() { if (Object.op_Implicit((Object)(object)Player.m_localPlayer)) { float mouseScrollWheel = ZInput.GetMouseScrollWheel(); if (UpdateSmooth(mouseScrollWheel) || UpdateRadius(mouseScrollWheel) || UpdateRaise(mouseScrollWheel) || UpdateLevel(mouseScrollWheel)) { UpdateHudPieceInfo(); } } } public void UpdateHudPieceInfo() { if (Object.op_Implicit((Object)(object)Hud.instance)) { StringBuilder stringBuilder = new StringBuilder(256); stringBuilder.Append(m_piece.m_description); stringBuilder.AppendFormat("\n[<color=orange>{0}</color> + <color=orange>{1}</color>] +- radius\n[<color=orange>{0}</color> + <color=orange>{2}</color>] +- smooth\n[<color=orange>{0}</color> + <color=orange>{3}</color>] +- raise\n[<color=orange>{0}</color> + <color=orange>{4}</color>] +- level\n", "Scroll", (object)(KeyCode)304, (object)(KeyCode)113, (object)(KeyCode)102, (object)(KeyCode)108); stringBuilder.Append($"SmoothPower: <color=orange>{m_tool.terrainOp.m_settings.m_smoothPower}</color>"); stringBuilder.Append($", RaisePower: <color=orange>{m_tool.terrainOp.m_settings.m_raisePower}</color>"); stringBuilder.Append($", RaiseDelta: <color=orange>{m_tool.terrainOp.m_settings.m_raiseDelta}</color>"); stringBuilder.Append($", LevelOffset: <color=orange>{m_tool.terrainOp.m_settings.m_levelOffset}</color>"); m_pieceInfo = Localization.instance.Localize(stringBuilder.ToString()); } } private bool UpdateRadius(float scroll) { if (!ZInput.GetKey((KeyCode)304, true)) { return false; } bool flag = false; if (scroll > Player.m_localPlayer.m_scrollAmountThreshold) { radius = Mathf.Clamp(radius + 0.5f, m_minRadius, m_maxRadius); flag = true; } if (scroll < 0f - Player.m_localPlayer.m_scrollAmountThreshold) { radius = Mathf.Clamp(radius - 0.5f, m_minRadius, m_maxRadius); flag = true; } if (!flag) { return false; } m_tool.terrainOp.m_settings.m_levelRadius = radius; m_tool.terrainOp.m_settings.m_raiseRadius = radius; m_tool.terrainOp.m_settings.m_paintRadius = radius; m_tool.terrainOp.m_settings.m_smoothRadius = radius + 1f; projector.m_radius = radius; projector.m_nrOfSegments = Math.Max(Mathf.CeilToInt(radius), 4); return true; } private bool UpdateSmooth(float scroll) { if (!ZInput.GetKey((KeyCode)113, true)) { return false; } bool flag = false; if (scroll > Player.m_localPlayer.m_scrollAmountThreshold) { m_tool.terrainOp.m_settings.m_smoothPower = Mathf.Clamp(m_tool.terrainOp.m_settings.m_smoothPower + 0.5f, 0f, m_maxSmooth); flag = true; } if (scroll < 0f - Player.m_localPlayer.m_scrollAmountThreshold) { m_tool.terrainOp.m_settings.m_smoothPower = Mathf.Clamp(m_tool.terrainOp.m_settings.m_smoothPower - 0.5f, 0f, m_maxSmooth); flag = true; } if (!flag) { return false; } m_tool.terrainOp.m_settings.m_smooth = m_tool.terrainOp.m_settings.m_smoothPower > 0f; return true; } private bool UpdateRaise(float scroll) { if (!ZInput.GetKey((KeyCode)102, true)) { return false; } bool flag = false; if (scroll > Player.m_localPlayer.m_scrollAmountThreshold) { m_tool.terrainOp.m_settings.m_raisePower = Mathf.Clamp01(m_tool.terrainOp.m_settings.m_raisePower + 0.1f); m_tool.terrainOp.m_settings.m_raiseDelta = Mathf.Clamp(m_tool.terrainOp.m_settings.m_raiseDelta + 0.5f, 0f, m_maxRaiseDelta); flag = true; } if (scroll < 0f - Player.m_localPlayer.m_scrollAmountThreshold) { m_tool.terrainOp.m_settings.m_raisePower = Mathf.Clamp01(m_tool.terrainOp.m_settings.m_raisePower - 0.1f); m_tool.terrainOp.m_settings.m_raiseDelta = Mathf.Clamp(m_tool.terrainOp.m_settings.m_raiseDelta - 0.5f, 0f, m_maxRaiseDelta); flag = true; } if (!flag) { return false; } m_tool.terrainOp.m_settings.m_raise = m_tool.terrainOp.m_settings.m_raiseDelta > 0f; return true; } private bool UpdateLevel(float scroll) { if (!ZInput.GetKey((KeyCode)108, true)) { return false; } bool flag = false; if (scroll > Player.m_localPlayer.m_scrollAmountThreshold) { Settings settings = m_tool.terrainOp.m_settings; settings.m_levelOffset += 1f; flag = true; } if (scroll < 0f - Player.m_localPlayer.m_scrollAmountThreshold) { Settings settings2 = m_tool.terrainOp.m_settings; settings2.m_levelOffset -= 1f; flag = true; } if (!flag) { return false; } m_tool.terrainOp.m_settings.m_level = m_tool.terrainOp.m_settings.m_levelOffset != 0f; return true; } } public class PavedDark : IPaint { public PavedDark(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("PavedCultivated"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) piece.m_icon = SpriteManager.GetSprite("paved_dark_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 1f, 0.5f, 1f); } } public class PavedGrass : IPaint { public PavedGrass(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("PavedGrass"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) piece.m_icon = SpriteManager.GetSprite("paved_grass_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0.5f, 0.5f); } } public class PlainsGrass : IPaint { public PlainsGrass(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("PlainsGrass"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; piece.m_icon = SpriteManager.GetSprite("plains_grass_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0f, 1f); } public override Color32 GetBiomeColor() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) return new Color32((byte)0, (byte)0, (byte)0, byte.MaxValue); } public override Biome GetBiome() { return (Biome)16; } } public class Reset : IPaint { public Reset(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("ResetAll"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; reset = true; piece.m_icon = SpriteManager.GetSprite("reset_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0f, 1f); } } public class Snow : IPaint { public Snow(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("Snow"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; piece.m_icon = SpriteManager.GetSprite("snow_icon.png"); } public override Color GetColor() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return Color.clear; } public override Color32 GetBiomeColor() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) return new Color32((byte)0, byte.MaxValue, (byte)0, (byte)0); } public override Biome GetBiome() { return (Biome)4; } } public class SwampGrass : IPaint { public SwampGrass(string id, string name, int index = 1) : base(id, name, PaintMan.GetPaintType("SwampGrass"), index) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) isBiomePaint = true; piece.m_icon = SpriteManager.GetSprite("swamp_grass_icon.png"); } public override Color GetColor() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) return new Color(0f, 0f, 0f, 1f); } public override Color32 GetBiomeColor() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) return new Color32(byte.MaxValue, (byte)0, (byte)0, (byte)0); } public override Biome GetBiome() { return (Biome)2; } } public class TerrainColors : MonoBehaviour { private static readonly List<TerrainColors> instances = new List<TerrainColors>(); public int m_width; public bool[] m_modifiedTerrain; public Color32[] m_terrainMask; public bool m_initialized; public TerrainComp m_terrainComp; public ZNetView m_nview; public void Awake() { m_nview = ((Component)this).GetComponent<ZNetView>(); m_terrainComp = ((Component)this).GetComponent<TerrainComp>(); instances.Add(this); } public void OnDestroy() { instances.Remove(this); } public void Initialize() { m_width = m_terrainComp.m_hmap.m_width; int num = m_width + 1; m_modifiedTerrain = new bool[num * num]; m_terrainMask = (Color32[])(object)new Color32[num * num]; m_initialized = true; } public void Save() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) if (!m_initialized || !m_nview.IsValid() || !m_nview.IsOwner()) { return; } ZPackage val = new ZPackage(); val.Write(m_modifiedTerrain.Length); for (int i = 0; i < m_modifiedTerrain.Length; i++) { bool flag = m_modifiedTerrain[i]; val.Write(flag); if (flag) { Color32 val2 = m_terrainMask[i]; val.Write(val2.r); val.Write(val2.g); val.Write(val2.b); val.Write(val2.a); } } byte[] array = Utils.Compress(val.GetArray()); m_nview.GetZDO().Set(PaintVars.TerrainColors, array); } public void Load() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) byte[] byteArray = m_nview.GetZDO().GetByteArray(PaintVars.TerrainColors, (byte[])null); if (byteArray == null) { return; } byte[] array = Utils.Decompress(byteArray); ZPackage val = new ZPackage(array); int num = val.ReadInt(); for (int i = 0; i < num; i++) { bool flag = val.ReadBool(); m_modifiedTerrain[i] = flag; if (flag) { byte b = val.ReadByte(); byte b2 = val.ReadByte(); byte b3 = val.ReadByte(); byte b4 = val.ReadByte(); m_terrainMask[i] = new Color32(b, b2, b3, b4); } else { m_terrainMask[i] = default(Color32); } } } public void SetBiomeColor(int index, Color32 color) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) if (m_initialized) { m_modifiedTerrain[index] = true; m_terrainMask[index] = color; } } public void ResetTerrain(int index) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) if (m_initialized) { m_modifiedTerrain[index] = false; m_terrainMask[index] = default(Color32); } } public void ApplyToHeightmap(Heightmap hm) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) if (!m_initialized) { return; } List<Color32> list = new List<Color32>(); hm.m_renderMesh.GetColors(list); int num = hm.m_width + 1; for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { int num2 = i * num + j; if (m_modifiedTerrain[num2]) { Color32 value = m_terrainMask[num2]; list[num2] = value; } } } hm.m_renderMesh.SetColors(list); } public Color32 GetCurrentBiomeColor(int index, int x, int y) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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) if (m_modifiedTerrain[index]) { return m_terrainMask[index]; } return Color32.op_Implicit(m_terrainComp.m_hmap.GetBiomeColor((float)x, (float)y)); } public Biome GetBiome(Heightmap hm, Vector3 point) { //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) if (hm.m_isDistantLod) { return hm.GetBiome(point, 0.02f, false); } try { int num = default(int); int num2 = default(int); hm.WorldToVertex(point, ref num, ref num2); int num3 = num2 * (m_width + 1) + num; if (!m_modifiedTerrain[num3]) { return hm.GetBiome(point, 0.02f, false); } Color32 val = m_terrainMask[num3]; if (val.r > 200 && val.a > 200) { return (Biome)32; } if (val.b > 200 && val.a > 200) { return (Biome)512; } if (val.r > 200) { return (Biome)2; } if (val.g > 200) { return (Biome)68; } if (val.b > 200) { return (Biome)8; } if (val.a > 200) { return (Biome)16; } return (Biome)1; } catch (IndexOutOfRangeException) { return hm.GetBiome(point, 0.02f, false); } } public static bool TryFindTerrainColors(Vector3 pos, out TerrainColors instance) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < instances.Count; i++) { TerrainColors terrainColors = instances[i]; float num = terrainColors.m_terrainComp.m_size / 2f; Vector3 position = ((Component)terrainColors).transform.position; if (pos.x >= position.x - num && pos.x <= position.x + num && pos.z >= position.z - num && pos.z <= position.z + num) { instance = terrainColors; return true; } } instance = null; return false; } public static TerrainColors FindTerrainColors(Vector3 pos) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < instances.Count; i++) { TerrainColors terrainColors = instances[i]; float num = terrainColors.m_terrainComp.m_size / 2f; Vector3 position = ((Component)terrainColors).transform.position; if (pos.x >= position.x - num && pos.x <= position.x + num && pos.z >= position.z - num && pos.z <= position.z + num) { return terrainColors; } } return null; } } [HarmonyPatch(typeof(ZNet), "OnNewConnection")] public static class RegisterAndCheckVersion { private static void Prefix(ZNetPeer peer, ref ZNet __instance) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown TerrainHoe.LogDebug("Registering version RPC handler"); peer.m_rpc.Register<ZPackage>("TerrainHoe_VersionCheck", (Action<ZRpc, ZPackage>)RpcHandlers.RPC_TerrainHoe_Version); TerrainHoe.LogDebug("Invoking version check"); ZPackage val = new ZPackage(); val.Write("1.0.2"); peer.m_rpc.Invoke("TerrainHoe_VersionCheck", new object[1] { val }); } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] public static class VerifyClient { private static bool Prefix(ZRpc rpc, ZPackage pkg, ref ZNet __instance) { if (!__instance.IsServer() || RpcHandlers.ValidatedPeers.Contains(rpc)) { return true; } TerrainHoe.LogWarning("Peer (" + rpc.m_socket.GetHostName() + ") never sent version or couldn't due to previous disconnect, disconnecting"); rpc.Invoke("Error", new object[1] { 3 }); return false; } private static void Postfix(ZNet __instance) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.instance.GetServerPeerID(), "TerrainHoeRequestAdminSync", new object[1] { (object)new ZPackage() }); } } [HarmonyPatch(typeof(FejdStartup), "ShowConnectError")] public class ShowConnectionError { private static void Postfix(FejdStartup __instance) { if (__instance.m_connectionFailedPanel.activeSelf) { __instance.m_connectionFailedError.fontSizeMax = 25f; __instance.m_connectionFailedError.fontSizeMin = 15f; TMP_Text connectionFailedError = __instance.m_connectionFailedError; connectionFailedError.text = connectionFailedError.text + "\n" + TerrainHoe.ConnectionError; } } } [HarmonyPatch(typeof(ZNet), "Disconnect")] public static class RemoveDisconnectedPeerFromVerified { private static void Prefix(ZNetPeer peer, ref ZNet __instance) { if (__instance.IsServer()) { TerrainHoe.LogInfo("Peer (" + peer.m_rpc.m_socket.GetHostName() + ") disconnected, removing from validated list"); RpcHandlers.ValidatedPeers.Remove(peer.m_rpc); } } } public static class RpcHandlers { public static readonly List<ZRpc> ValidatedPeers = new List<ZRpc>(); public static void RPC_TerrainHoe_Version(ZRpc rpc, ZPackage pkg) { string text = pkg.ReadString(); TerrainHoe.LogInfo("Version check, local: 1.0.2, remote: " + text); if (text != "1.0.2") { TerrainHoe.ConnectionError = "TerrainHoe Installed: 1.0.2\n Needed: " + text; if (ZNet.instance.IsServer()) { TerrainHoe.LogWarning("Peer (" + rpc.m_socket.GetHostName() + ") has incompatible version, disconnecting..."); rpc.Invoke("Error", new object[1] { 3 }); } } else if (!ZNet.instance.IsServer()) { TerrainHoe.LogInfo("Received same version from server!"); } else { TerrainHoe.LogInfo("Adding peer (" + rpc.m_socket.GetHostName() + ") to validated list"); ValidatedPeers.Add(rpc); } } } } namespace Microsoft.CodeAnalysis { [<16b79ab8-ee9e-43bd-9508-d59624ee0b71>Embedded] [CompilerGenerated] internal sealed class <16b79ab8-ee9e-43bd-9508-d59624ee0b71>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [<16b79ab8-ee9e-43bd-9508-d59624ee0b71>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] [CompilerGenerated] internal sealed class <19f94b00-559a-4e66-8961-19aec2f522f0>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <19f94b00-559a-4e66-8961-19aec2f522f0>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <19f94b00-559a-4e66-8961-19aec2f522f0>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [<16b79ab8-ee9e-43bd-9508-d59624ee0b71>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <54d60f51-74e7-44c8-a953-5613d1ae5f79>NullableContextAttribute : Attribute { public readonly byte Flag; public <54d60f51-74e7-44c8-a953-5613d1ae5f79>NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [<16b79ab8-ee9e-43bd-9508-d59624ee0b71>Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class <3d30bf07-99df-446c-8040-9d1e8d0628fc>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <3d30bf07-99df-446c-8040-9d1e8d0628fc>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ServerSync { [<19f94b00-559a-4e66-8961-19aec2f522f0>Nullable(0)] [<54d60f51-74e7-44c8-a953-5613d1ae5f79>NullableContext(1)] [PublicAPI] internal abstract class OwnConfigEntryBase { [<19f94b00-559a-4e66-8961-19aec2f522f0>Nullable(2)] public object LocalBaseValue; public bool SynchronizedConfig = true; public abstract ConfigEntryBase BaseConfig { get; } } [<54d60f51-74e7-44c8-a953-5613d1ae5f79>NullableContext(1)] [PublicAPI] [<19f94b00-559a-4e66-8961-19aec2f522f0>Nullable(0)] internal class SyncedConfigEntry<[<19f94b00-559a-4e66-8961-19aec2f522f0>Nullable(2)] T> : OwnConfigEntryBase { public readonly ConfigEntry<T> SourceConfig; public override ConfigEntryBase BaseConfig => (ConfigEntryBase)(object)SourceConfig; public T Value { get { return SourceConfig.Value; } set { SourceConfig.Value = value; } } public SyncedConfigEntry(ConfigEntry<T> sourceConfig) { SourceConfig = sourceConfig; base..ctor(); } public void AssignLocalValue(T value) { if (LocalBaseValue == null) { Value = value; } else { LocalBaseValue = value; } } } [<19f94b00-559a-4e66-8961-19aec2f522f0>Nullable(0)] [<54d60f51-74e7-44c8-a953-5613d1ae5f79>NullableContext(2)] internal abstract class CustomSyncedValueBase { public object LocalBaseValue; [<19f94b00-559a-4e66-8961-19aec2f522f0>Nullable(1)] public readonly string Identifier; [<19f94b00-559a-4e66-8961-19aec2f522f0>Nullable(1)] public readonly Type Type; private object boxedValue; protected bool localIsOwner; public readonly int Priority; public object BoxedValue { get { return boxedValue; } set { boxedValue = value; this.ValueChanged?.Invoke(); } } public event Action ValueChanged; [<54d60f51-74e7-44c8-a953-5613d1ae5f79>NullableContext(1)] protected CustomSyncedValueBase(ConfigSync configSync, str