using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using System.Threading.Tasks; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using BiomeManager; using CreatureManager; using HarmonyLib; using ItemManager; using JetBrains.Annotations; using LocationManager; using Microsoft.CodeAnalysis; using PieceManager; using ServerSync; using SoftReferenceableAssets; using TMPro; using UnityEngine; using UnityEngine.UI; using UpgradeWorld; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("DeepNorthGlitnir")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyProduct("DeepNorthGlitnir")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("E74EB49A-461D-48EA-85BC-F462D60C98C4")] [assembly: AssemblyFileVersion("0.2.4")] [assembly: AssemblyCompany("Marlthon")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.2.4.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<0a104793-3f54-443b-b2b5-d87fd929ff71>Embedded] internal sealed class <0a104793-3f54-443b-b2b5-d87fd929ff71>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<0a104793-3f54-443b-b2b5-d87fd929ff71>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [<0a104793-3f54-443b-b2b5-d87fd929ff71>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContextAttribute : Attribute { public readonly byte Flag; public <0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContextAttribute(byte P_0) { Flag = P_0; } } } [ExecuteInEditMode] public class PortalFX_AxisRotateByTime : MonoBehaviour { public Vector3 RotateAxis = new Vector3(1f, 5f, 10f); private void Start() { } private void Update() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) ((Component)this).transform.Rotate(RotateAxis * Time.deltaTime); } } [Nullable(0)] [ExecuteInEditMode] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] public class PortalFX_Turbulence : MonoBehaviour { public float TurbulenceStrenght = 1f; public Vector3 Frequency = new Vector3(1f, 1f, 1f); public Vector3 OffsetSpeed = new Vector3(0.5f, 0.5f, 0.5f); public Vector3 Amplitude = new Vector3(5f, 5f, 5f); public Vector3 GlobalForce; private float lastStopTime; private Vector3 currentOffset; private float deltaTime; private Particle[] particleArray; private ParticleSystem particleSys; private float time; private void Start() { particleSys = ((Component)this).GetComponent(); if (particleArray == null || particleArray.Length < particleSys.maxParticles) { particleArray = (Particle[])(object)new Particle[particleSys.maxParticles]; } } private void Update() { //IL_004d: 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_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) //IL_007c: 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_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: 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_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) int particles = particleSys.GetParticles(particleArray); if (!Application.isPlaying) { deltaTime = Time.realtimeSinceStartup - lastStopTime; lastStopTime = Time.realtimeSinceStartup; } else { deltaTime = Time.deltaTime; } currentOffset += OffsetSpeed * deltaTime; for (int i = 0; i < particles; i++) { Particle val = particleArray[i]; float num = 1f; Vector3 position = ((Particle)(ref val)).position; position.x /= Frequency.x; position.y /= Frequency.y; position.z /= Frequency.z; Vector3 val2 = default(Vector3); val2.x = ((Mathf.PerlinNoise(position.z - currentOffset.z, position.y - currentOffset.y) * 2f - 1f) * Amplitude.x + GlobalForce.x) * deltaTime; val2.y = ((Mathf.PerlinNoise(position.x - currentOffset.x, position.z - currentOffset.z) * 2f - 1f) * Amplitude.y + GlobalForce.y) * deltaTime; val2.z = ((Mathf.PerlinNoise(position.y - currentOffset.y, position.x - currentOffset.x) * 2f - 1f) * Amplitude.z + GlobalForce.z) * deltaTime; val2 *= TurbulenceStrenght * num; ref Particle reference = ref particleArray[i]; ((Particle)(ref reference)).position = ((Particle)(ref reference)).position + val2; } particleSys.SetParticles(particleArray, particles); } } namespace UpgradeWorld { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public class CommandRegistration { public string name = ""; public string description = ""; public string[] commands = new string[0]; public void AddCommand() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) new ConsoleCommand(name, description, (ConsoleEvent)([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (ConsoleEventArgs args) => { string[] array = commands; foreach (string text in array) { args.Context.TryRunCommand(text, false, false); } }), false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public static class Upgrade { private static List registrations = new List(); public const string GUID = "upgrade_world"; private static bool Patched = false; public static void Register(string name, string description, params string[] commands) { if (Chainloader.PluginInfos.ContainsKey("upgrade_world")) { PatchIfNeeded(); registrations.Add(new CommandRegistration { name = name, description = description, commands = commands }); } } private static void PatchIfNeeded() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown if (!Patched) { Patched = true; Harmony val = new Harmony("helpers.upgrade_world"); MethodInfo methodInfo = AccessTools.Method(typeof(Terminal), "InitTerminal", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(Upgrade), "AddCommands", (Type[])null, (Type[])null); val.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } private static void AddCommands() { foreach (CommandRegistration registration in registrations) { registration.AddCommand(); } } } } namespace PieceManager { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [PublicAPI] [Nullable(0)] public static class MaterialReplacer { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] public enum ShaderType { PieceShader, VegetationShader, RockShader, RugShader, GrassShader, CustomCreature, UseUnityShader } private static readonly Dictionary ObjectToSwap; private static readonly Dictionary OriginalMaterials; private static readonly Dictionary ObjectsForShaderReplace; private static readonly HashSet CachedShaders; private static bool hasRun; static MaterialReplacer() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown CachedShaders = new HashSet(); hasRun = false; OriginalMaterials = new Dictionary(); ObjectToSwap = new Dictionary(); ObjectsForShaderReplace = new Dictionary(); Harmony val = new Harmony("org.bepinex.helpers.PieceManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZoneSystem), "Start", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(MaterialReplacer), "ReplaceAllMaterialsWithOriginal", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } public static void RegisterGameObjectForShaderSwap(GameObject go, ShaderType type) { if (!ObjectsForShaderReplace.ContainsKey(go)) { ObjectsForShaderReplace.Add(go, type); } } public static void RegisterGameObjectForMatSwap(GameObject go, bool isJotunnMock = false) { if (!ObjectToSwap.ContainsKey(go)) { ObjectToSwap.Add(go, isJotunnMock); } } private static void GetAllMaterials() { Material[] array = Resources.FindObjectsOfTypeAll(); foreach (Material val in array) { OriginalMaterials[((Object)val).name] = val; } } [HarmonyPriority(700)] private static void ReplaceAllMaterialsWithOriginal() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)SystemInfo.graphicsDeviceType == 4 || hasRun) { return; } if (OriginalMaterials.Count == 0) { GetAllMaterials(); } foreach (KeyValuePair item in ObjectToSwap) { GameObject key = item.Key; bool value = item.Value; ProcessGameObjectMaterials(key, value); } AssetBundle[] array = Resources.FindObjectsOfTypeAll(); AssetBundle[] array2 = array; foreach (AssetBundle val in array2) { IEnumerable enumerable3; try { IEnumerable enumerable2; if (!val.isStreamedSceneAssetBundle || !Object.op_Implicit((Object)(object)val)) { IEnumerable enumerable = val.LoadAllAssets(); enumerable2 = enumerable; } else { enumerable2 = from shader in ((IEnumerable)val.GetAllAssetNames()).Select((Func)val.LoadAsset) where (Object)(object)shader != (Object)null select shader; } enumerable3 = enumerable2; } catch (Exception) { continue; } if (enumerable3 == null) { continue; } foreach (Shader item2 in enumerable3) { CachedShaders.Add(item2); } } foreach (KeyValuePair item3 in ObjectsForShaderReplace) { GameObject key2 = item3.Key; ShaderType value2 = item3.Value; ProcessGameObjectShaders(key2, value2); } hasRun = true; } private static void ProcessGameObjectMaterials(GameObject go, bool isJotunnMock) { Renderer[] componentsInChildren = go.GetComponentsInChildren(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material[] sharedMaterials = val.sharedMaterials.Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Material material) => ReplaceMaterial(material, isJotunnMock)).ToArray(); val.sharedMaterials = sharedMaterials; } } private static Material ReplaceMaterial(Material originalMaterial, bool isJotunnMock) { string text = (isJotunnMock ? "JVLmock_" : "_REPLACE_"); if (!((Object)originalMaterial).name.StartsWith(text, StringComparison.Ordinal)) { return originalMaterial; } string text2 = ((Object)originalMaterial).name.Replace(" (Instance)", "").Replace(text, ""); if (OriginalMaterials.TryGetValue(text2, out var value)) { return value; } Debug.LogWarning((object)("No suitable material found to replace: " + text2)); return originalMaterial; } private static void ProcessGameObjectShaders(GameObject go, ShaderType shaderType) { Renderer[] componentsInChildren = go.GetComponentsInChildren(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material[] sharedMaterials = val.sharedMaterials; foreach (Material val2 in sharedMaterials) { if ((Object)(object)val2 != (Object)null) { val2.shader = GetShaderForType(val2.shader, shaderType, ((Object)val2.shader).name); } } } } private static Shader GetShaderForType(Shader orig, ShaderType shaderType, string originalShaderName) { return (Shader)(shaderType switch { ShaderType.PieceShader => FindShaderWithName(orig, "Custom/Piece"), ShaderType.VegetationShader => FindShaderWithName(orig, "Custom/Vegetation"), ShaderType.RockShader => FindShaderWithName(orig, "Custom/StaticRock"), ShaderType.RugShader => FindShaderWithName(orig, "Custom/Rug"), ShaderType.GrassShader => FindShaderWithName(orig, "Custom/Grass"), ShaderType.CustomCreature => FindShaderWithName(orig, "Custom/Creature"), ShaderType.UseUnityShader => FindShaderWithName(orig, ((Object)(object)FindShaderWithName(orig, originalShaderName) != (Object)null) ? originalShaderName : "ToonDeferredShading2017"), _ => FindShaderWithName(orig, "Standard"), }); } public static Shader FindShaderWithName(Shader origShader, string name) { foreach (Shader cachedShader in CachedShaders) { if (((Object)cachedShader).name == name) { return cachedShader; } } return origShader; } } [PublicAPI] public enum CraftingTable { None, [InternalName("piece_workbench")] Workbench, [InternalName("piece_cauldron")] Cauldron, [InternalName("forge")] Forge, [InternalName("piece_artisanstation")] ArtisanTable, [InternalName("piece_stonecutter")] StoneCutter, [InternalName("piece_magetable")] MageTable, [InternalName("blackforge")] BlackForge, [InternalName("piece_preptable")] FoodPreparationTable, [InternalName("piece_MeadCauldron")] MeadKetill, Custom } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public class InternalName : Attribute { public readonly string internalName; public InternalName(string internalName) { this.internalName = internalName; } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] [PublicAPI] public class ExtensionList { public readonly List ExtensionStations = new List(); public void Set(CraftingTable table, int maxStationDistance = 5) { ExtensionStations.Add(new ExtensionConfig { Table = table, maxStationDistance = maxStationDistance }); } public void Set(string customTable, int maxStationDistance = 5) { ExtensionStations.Add(new ExtensionConfig { Table = CraftingTable.Custom, custom = customTable, maxStationDistance = maxStationDistance }); } } public struct ExtensionConfig { public CraftingTable Table; public float maxStationDistance; [Nullable(2)] public string custom; } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [PublicAPI] [Nullable(0)] public class CraftingStationList { public readonly List Stations = new List(); public void Set(CraftingTable table) { Stations.Add(new CraftingStationConfig { Table = table }); } public void Set(string customTable) { Stations.Add(new CraftingStationConfig { Table = CraftingTable.Custom, custom = customTable }); } } public struct CraftingStationConfig { public CraftingTable Table; public int level; [Nullable(2)] public string custom; } [PublicAPI] public enum BuildPieceCategory { Misc = 0, Crafting = 1, BuildingWorkbench = 2, BuildingStonecutter = 3, Furniture = 4, All = 100, Custom = 99 } [Nullable(0)] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [PublicAPI] public class RequiredResourcesList { public readonly List Requirements = new List(); public void Add(string item, int amount, bool recover) { Requirements.Add(new Requirement { itemName = item, amount = amount, recover = recover }); } } public struct Requirement { [Nullable(1)] public string itemName; public int amount; public bool recover; } public struct SpecialProperties { [Description("Admins should be the only ones that can build this piece.")] public bool AdminOnly; [Description("Turns off generating a config for this build piece.")] public bool NoConfig; } [PublicAPI] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public class BuildingPieceCategory { public BuildPieceCategory Category; public string custom = ""; public void Set(BuildPieceCategory category) { Category = category; } public void Set(string customCategory) { Category = BuildPieceCategory.Custom; custom = customCategory; } } [PublicAPI] [Nullable(0)] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] public class PieceTool { public readonly HashSet Tools = new HashSet(); public void Add(string tool) { Tools.Add(tool); } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] [PublicAPI] public class BuildPiece { [Nullable(0)] internal class PieceConfig { public ConfigEntry craft = null; public ConfigEntry category = null; public ConfigEntry customCategory = null; public ConfigEntry tools = null; public ConfigEntry extensionTable = null; public ConfigEntry customExtentionTable = null; public ConfigEntry maxStationDistance = null; public ConfigEntry table = null; public ConfigEntry customTable = null; } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [Nullable(2)] [UsedImplicitly] public string Category; [UsedImplicitly] [Nullable(new byte[] { 2, 1 })] public Action CustomDrawer; } [Nullable(0)] private class SerializedRequirements { public readonly List Reqs; public SerializedRequirements(List reqs) { Reqs = reqs; } public SerializedRequirements(string reqs) { Reqs = reqs.Split(new char[1] { ',' }).Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (string r) => { string[] array = r.Split(new char[1] { ':' }); Requirement result = default(Requirement); result.itemName = array[0]; result.amount = ((array.Length <= 1 || !int.TryParse(array[1], out var result2)) ? 1 : result2); bool result3 = default(bool); result.recover = array.Length <= 2 || !bool.TryParse(array[2], out result3) || result3; return result; }).ToList(); } public override string ToString() { return string.Join(",", Reqs.Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Requirement r) => $"{r.itemName}:{r.amount}:{r.recover}")); } [return: Nullable(2)] public static ItemDrop fetchByName(ObjectDB objectDB, string name) { GameObject itemPrefab = objectDB.GetItemPrefab(name); ItemDrop val = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)(((!string.IsNullOrWhiteSpace(((Object)plugin).name)) ? ("[" + ((Object)plugin).name + "]") : "") + " The required item '" + name + "' does not exist.")); } return val; } public static Requirement[] toPieceReqs(SerializedRequirements craft) { Dictionary dictionary = craft.Reqs.Where((Requirement r) => r.itemName != "").ToDictionary((Func)([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Requirement r) => r.itemName), (Func)([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Requirement r) => { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) ItemDrop val = ResItem(r); return (val == null) ? ((Requirement)null) : new Requirement { m_amount = r.amount, m_resItem = val, m_recover = r.recover }; })); return dictionary.Values.Where([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Requirement v) => v != null).ToArray(); [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(2)] static ItemDrop ResItem(Requirement r) { return fetchByName(ObjectDB.instance, r.itemName); } } } internal static readonly List registeredPieces = new List(); private static readonly Dictionary pieceMap = new Dictionary(); internal static Dictionary pieceConfigs = new Dictionary(); internal List Conversions = new List(); internal List conversions = new List(); [Description("Disables generation of the configs for your pieces. This is global, this turns it off for all pieces in your mod.")] public static bool ConfigurationEnabled = true; public readonly GameObject Prefab; [Description("Specifies the resources needed to craft the piece.\nUse .Add to add resources with their internal ID and an amount.\nUse one .Add for each resource type the building piece should need.")] public readonly RequiredResourcesList RequiredItems = new RequiredResourcesList(); [Description("Sets the category for the building piece.")] public readonly BuildingPieceCategory Category = new BuildingPieceCategory(); [Description("Specifies the tool needed to build your piece.\nUse .Add to add a tool.")] public readonly PieceTool Tool = new PieceTool(); [Description("Specifies the crafting station needed to build your piece.\nUse .Add to add a crafting station, using the CraftingTable enum and a minimum level for the crafting station.")] public CraftingStationList Crafting = new CraftingStationList(); [Description("Makes this piece a station extension")] public ExtensionList Extension = new ExtensionList(); [Description("Change the extended/special properties of your build piece.")] public SpecialProperties SpecialProperties; [Nullable(2)] [Description("Specifies a config entry which toggles whether a recipe is active.")] public ConfigEntryBase RecipeIsActive = null; [Nullable(2)] private LocalizeKey _name; [Nullable(2)] private LocalizeKey _description; internal string[] activeTools = null; [Nullable(2)] private static object configManager; [Nullable(2)] private static Localization _english; [Nullable(2)] internal static BaseUnityPlugin _plugin = null; private static bool hasConfigSync = true; [Nullable(2)] private static object _configSync; public LocalizeKey Name { get { LocalizeKey name = _name; if (name != null) { return name; } Piece component = Prefab.GetComponent(); if (component.m_name.StartsWith("$")) { _name = new LocalizeKey(component.m_name); } else { string text = "$piece_" + ((Object)Prefab).name.Replace(" ", "_"); _name = new LocalizeKey(text).English(component.m_name); component.m_name = text; } return _name; } } public LocalizeKey Description { get { LocalizeKey description = _description; if (description != null) { return description; } Piece component = Prefab.GetComponent(); if (component.m_description.StartsWith("$")) { _description = new LocalizeKey(component.m_description); } else { string text = "$piece_" + ((Object)Prefab).name.Replace(" ", "_") + "_description"; _description = new LocalizeKey(text).English(component.m_description); component.m_description = text; } return _description; } } private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English")); internal static BaseUnityPlugin plugin { get { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown if (_plugin != null) { return _plugin; } IEnumerable 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([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); return _plugin; } } [Nullable(2)] private static object configSync { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(2)] get { if (_configSync != null || !hasConfigSync) { return _configSync; } Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync"); if ((object)type != null) { _configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " PieceManager"); type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString()); type.GetProperty("IsLocked").SetValue(_configSync, true); } else { hasConfigSync = false; } return _configSync; } } public BuildPiece(string assetBundleFileName, string prefabName, string folderName = "assets") : this(PiecePrefabManager.RegisterAssetBundle(assetBundleFileName, folderName), prefabName) { } public BuildPiece(AssetBundle bundle, string prefabName) { Prefab = PiecePrefabManager.RegisterPrefab(bundle, prefabName); registeredPieces.Add(this); } internal static void Patch_FejdStartup(FejdStartup __instance) { //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Expected O, but got Unknown //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Expected O, but got Unknown //IL_0431: Unknown result type (might be due to invalid IL or missing references) //IL_040b: Unknown result type (might be due to invalid IL or missing references) //IL_0410: Unknown result type (might be due to invalid IL or missing references) //IL_048c: Unknown result type (might be due to invalid IL or missing references) //IL_0496: Expected O, but got Unknown //IL_0606: Unknown result type (might be due to invalid IL or missing references) //IL_0610: Expected O, but got Unknown //IL_08ea: Unknown result type (might be due to invalid IL or missing references) //IL_08f4: Expected O, but got Unknown //IL_067b: Unknown result type (might be due to invalid IL or missing references) //IL_0685: Expected O, but got Unknown //IL_0721: Unknown result type (might be due to invalid IL or missing references) //IL_072b: Expected O, but got Unknown //IL_095f: Unknown result type (might be due to invalid IL or missing references) //IL_0969: Expected O, but got Unknown //IL_0b7e: Unknown result type (might be due to invalid IL or missing references) //IL_0b88: Expected O, but got Unknown //IL_0c18: Unknown result type (might be due to invalid IL or missing references) //IL_0c22: Expected O, but got Unknown Type configManagerType = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Assembly a) => a.GetName().Name == "ConfigurationManager")?.GetType("ConfigurationManager.ConfigurationManager"); configManager = ((configManagerType == null) ? null : Chainloader.ManagerObject.GetComponent(configManagerType)); foreach (BuildPiece registeredPiece in registeredPieces) { registeredPiece.activeTools = registeredPiece.Tool.Tools.DefaultIfEmpty("Hammer").ToArray(); if (registeredPiece.Category.Category != BuildPieceCategory.Custom) { registeredPiece.Prefab.GetComponent().m_category = (PieceCategory)registeredPiece.Category.Category; } else { registeredPiece.Prefab.GetComponent().m_category = PiecePrefabManager.GetCategory(registeredPiece.Category.custom); } } if (!ConfigurationEnabled) { return; } bool saveOnConfigSet = plugin.Config.SaveOnConfigSet; plugin.Config.SaveOnConfigSet = false; foreach (BuildPiece registeredPiece2 in registeredPieces) { BuildPiece piece = registeredPiece2; if (piece.SpecialProperties.NoConfig) { continue; } PieceConfig pieceConfig2 = (pieceConfigs[piece] = new PieceConfig()); PieceConfig cfg = pieceConfig2; Piece piecePrefab2 = piece.Prefab.GetComponent(); string pieceName = piecePrefab2.m_name; string englishName = new Regex("[=\\n\\t\\\\\"\\'\\[\\]]*").Replace(english.Localize(pieceName), "").Trim(); string localizedName = Localization.instance.Localize(pieceName).Trim(); int order = 0; cfg.category = config(englishName, "Build Table Category", piece.Category.Category, new ConfigDescription("Build Category where " + localizedName + " is available.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = (order -= 1), Category = localizedName } })); ConfigurationManagerAttributes customTableAttributes = new ConfigurationManagerAttributes { Order = (order -= 1), Browsable = (cfg.category.Value == BuildPieceCategory.Custom), Category = localizedName }; cfg.customCategory = config(englishName, "Custom Build Category", piece.Category.custom, new ConfigDescription("", (AcceptableValueBase)null, new object[1] { customTableAttributes })); cfg.category.SettingChanged += BuildTableConfigChanged; cfg.customCategory.SettingChanged += BuildTableConfigChanged; if (cfg.category.Value == BuildPieceCategory.Custom) { piecePrefab2.m_category = PiecePrefabManager.GetCategory(cfg.customCategory.Value); } else { piecePrefab2.m_category = (PieceCategory)cfg.category.Value; } cfg.tools = config(englishName, "Tools", string.Join(", ", piece.activeTools), new ConfigDescription("Comma separated list of tools where " + localizedName + " is available.", (AcceptableValueBase)null, new object[1] { customTableAttributes })); piece.activeTools = (from s in cfg.tools.Value.Split(new char[1] { ',' }) select s.Trim()).ToArray(); cfg.tools.SettingChanged += [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object _, EventArgs _) => { Inventory[] source = (from c in Player.s_players.Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Player p) => ((Humanoid)p).GetInventory()).Concat(from c in Object.FindObjectsOfType() select c.GetInventory()) where c != null select c).ToArray(); Dictionary> dictionary = (from kv in (from i in (from p in ObjectDB.instance.m_items select p.GetComponent() into c where Object.op_Implicit((Object)(object)c) && Object.op_Implicit((Object)(object)((Component)c).GetComponent()) select c).Concat(ItemDrop.s_instances) select new KeyValuePair(Utils.GetPrefabName(((Component)i).gameObject), i.m_itemData)).Concat(from i in source.SelectMany([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Inventory i) => i.GetAllItems()) select new KeyValuePair(((Object)i.m_dropPrefab).name, i)) where Object.op_Implicit((Object)(object)kv.Value.m_shared.m_buildPieces) group kv by kv.Key).ToDictionary([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (IGrouping> g) => g.Key, [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (IGrouping> g) => g.Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (KeyValuePair kv) => kv.Value.m_shared.m_buildPieces).Distinct().ToList()); string[] array5 = piece.activeTools; foreach (string key in array5) { if (dictionary.TryGetValue(key, out var value3)) { foreach (PieceTable item3 in value3) { item3.m_pieces.Remove(piece.Prefab); } } } piece.activeTools = (from s in cfg.tools.Value.Split(new char[1] { ',' }) select s.Trim()).ToArray(); if (Object.op_Implicit((Object)(object)ObjectDB.instance)) { string[] array6 = piece.activeTools; foreach (string key2 in array6) { if (dictionary.TryGetValue(key2, out var value4)) { foreach (PieceTable item4 in value4) { if (!item4.m_pieces.Contains(piece.Prefab)) { item4.m_pieces.Add(piece.Prefab); } } } } if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && Object.op_Implicit((Object)(object)Player.m_localPlayer.m_buildPieces)) { PiecePrefabManager.CategoryRefreshNeeded = true; ((Humanoid)Player.m_localPlayer).SetPlaceMode(Player.m_localPlayer.m_buildPieces); } } }; StationExtension pieceExtensionComp; List hideWhenNoneAttributes2; if (piece.Extension.ExtensionStations.Count > 0) { pieceExtensionComp = piece.Prefab.GetOrAddComponent(); PieceConfig pieceConfig3 = cfg; string group = englishName; CraftingTable table = piece.Extension.ExtensionStations.First().Table; string text = "Crafting station that " + localizedName + " extends."; object[] array = new object[1]; ConfigurationManagerAttributes configurationManagerAttributes = new ConfigurationManagerAttributes(); int num = order - 1; order = num; configurationManagerAttributes.Order = num; array[0] = configurationManagerAttributes; pieceConfig3.extensionTable = config(group, "Extends Station", table, new ConfigDescription(text, (AcceptableValueBase)null, array)); cfg.customExtentionTable = config(englishName, "Custom Extend Station", piece.Extension.ExtensionStations.First().custom ?? "", new ConfigDescription("", (AcceptableValueBase)null, new object[1] { customTableAttributes })); PieceConfig pieceConfig4 = cfg; string group2 = englishName; float maxStationDistance = piece.Extension.ExtensionStations.First().maxStationDistance; string text2 = "Distance from the station that " + localizedName + " can be placed."; object[] array2 = new object[1]; ConfigurationManagerAttributes configurationManagerAttributes2 = new ConfigurationManagerAttributes(); num = order - 1; order = num; configurationManagerAttributes2.Order = num; array2[0] = configurationManagerAttributes2; pieceConfig4.maxStationDistance = config(group2, "Max Station Distance", maxStationDistance, new ConfigDescription(text2, (AcceptableValueBase)null, array2)); hideWhenNoneAttributes2 = new List(); cfg.extensionTable.SettingChanged += ExtensionTableConfigChanged; cfg.customExtentionTable.SettingChanged += ExtensionTableConfigChanged; cfg.maxStationDistance.SettingChanged += ExtensionTableConfigChanged; ConfigurationManagerAttributes configurationManagerAttributes3 = new ConfigurationManagerAttributes(); num = order - 1; order = num; configurationManagerAttributes3.Order = num; configurationManagerAttributes3.Browsable = cfg.extensionTable.Value != CraftingTable.None; ConfigurationManagerAttributes item = configurationManagerAttributes3; hideWhenNoneAttributes2.Add(item); } List hideWhenNoneAttributes; if (piece.Crafting.Stations.Count > 0) { hideWhenNoneAttributes = new List(); PieceConfig pieceConfig5 = cfg; string group3 = englishName; CraftingTable table2 = piece.Crafting.Stations.First().Table; string text3 = "Crafting station where " + localizedName + " is available."; object[] array3 = new object[1]; ConfigurationManagerAttributes configurationManagerAttributes4 = new ConfigurationManagerAttributes(); int num = order - 1; order = num; configurationManagerAttributes4.Order = num; array3[0] = configurationManagerAttributes4; pieceConfig5.table = config(group3, "Crafting Station", table2, new ConfigDescription(text3, (AcceptableValueBase)null, array3)); cfg.customTable = config(englishName, "Custom Crafting Station", piece.Crafting.Stations.First().custom ?? "", new ConfigDescription("", (AcceptableValueBase)null, new object[1] { customTableAttributes })); cfg.table.SettingChanged += TableConfigChanged; cfg.customTable.SettingChanged += TableConfigChanged; ConfigurationManagerAttributes configurationManagerAttributes5 = new ConfigurationManagerAttributes(); num = order - 1; order = num; configurationManagerAttributes5.Order = num; configurationManagerAttributes5.Browsable = cfg.table.Value != CraftingTable.None; ConfigurationManagerAttributes item2 = configurationManagerAttributes5; hideWhenNoneAttributes.Add(item2); } cfg.craft = itemConfig("Crafting Costs", new SerializedRequirements(piece.RequiredItems.Requirements).ToString(), "Item costs to craft " + localizedName); cfg.craft.SettingChanged += [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object _, EventArgs _) => { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && (Object)(object)ObjectDB.instance.GetItemPrefab("YmirRemains") != (Object)null) { Requirement[] resources = SerializedRequirements.toPieceReqs(new SerializedRequirements(cfg.craft.Value)); piecePrefab2.m_resources = resources; Piece[] array4 = Object.FindObjectsOfType(); foreach (Piece val in array4) { if (val.m_name == pieceName) { val.m_resources = resources; } } } }; for (int j = 0; j < piece.Conversions.Count; j++) { string text4 = ((piece.Conversions.Count > 1) ? $"{j + 1}. " : ""); Conversion conversion = piece.Conversions[j]; conversion.config = new Conversion.ConversionConfig(); int index = j; conversion.config.input = config(englishName, text4 + "Conversion Input Item", conversion.Input, new ConfigDescription("Conversion input item within " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName } })); conversion.config.input.SettingChanged += [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object _, EventArgs _) => { if (index < piece.conversions.Count) { ObjectDB instance2 = ObjectDB.instance; if (instance2 != null) { ItemDrop from = SerializedRequirements.fetchByName(instance2, conversion.config.input.Value); piece.conversions[index].m_from = from; } } }; conversion.config.output = config(englishName, text4 + "Conversion Output Item", conversion.Output, new ConfigDescription("Conversion output item within " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName } })); conversion.config.output.SettingChanged += [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object _, EventArgs _) => { if (index < piece.conversions.Count) { ObjectDB instance = ObjectDB.instance; if (instance != null) { ItemDrop to = SerializedRequirements.fetchByName(instance, conversion.config.output.Value); piece.conversions[index].m_to = to; } } }; } void BuildTableConfigChanged(object o, EventArgs e) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) if (registeredPieces.Count > 0) { if (cfg.category.Value == BuildPieceCategory.Custom) { piecePrefab2.m_category = PiecePrefabManager.GetCategory(cfg.customCategory.Value); } else { piecePrefab2.m_category = (PieceCategory)cfg.category.Value; } if (Object.op_Implicit((Object)(object)Hud.instance)) { PiecePrefabManager.CategoryRefreshNeeded = true; PiecePrefabManager.CreateCategoryTabs(); } } customTableAttributes.Browsable = cfg.category.Value == BuildPieceCategory.Custom; ReloadConfigDisplay(); } void ExtensionTableConfigChanged(object o, EventArgs e) { if (piece.RequiredItems.Requirements.Count > 0) { CraftingTable value2 = cfg.extensionTable.Value; CraftingTable craftingTable = value2; if (craftingTable == CraftingTable.Custom) { StationExtension obj2 = pieceExtensionComp; GameObject prefab2 = ZNetScene.instance.GetPrefab(cfg.customExtentionTable.Value); obj2.m_craftingStation = ((prefab2 != null) ? prefab2.GetComponent() : null); } else { pieceExtensionComp.m_craftingStation = ZNetScene.instance.GetPrefab(((InternalName)typeof(CraftingTable).GetMember(cfg.extensionTable.Value.ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).GetComponent(); } pieceExtensionComp.m_maxStationDistance = cfg.maxStationDistance.Value; } customTableAttributes.Browsable = cfg.extensionTable.Value == CraftingTable.Custom; foreach (ConfigurationManagerAttributes item5 in hideWhenNoneAttributes2) { item5.Browsable = cfg.extensionTable.Value != CraftingTable.None; } ReloadConfigDisplay(); plugin.Config.Save(); } void TableConfigChanged(object o, EventArgs e) { if (piece.RequiredItems.Requirements.Count > 0) { switch (cfg.table.Value) { case CraftingTable.None: piecePrefab2.m_craftingStation = null; break; case CraftingTable.Custom: { Piece obj = piecePrefab2; GameObject prefab = ZNetScene.instance.GetPrefab(cfg.customTable.Value); obj.m_craftingStation = ((prefab != null) ? prefab.GetComponent() : null); break; } default: piecePrefab2.m_craftingStation = ZNetScene.instance.GetPrefab(((InternalName)typeof(CraftingTable).GetMember(cfg.table.Value.ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).GetComponent(); break; } } customTableAttributes.Browsable = cfg.table.Value == CraftingTable.Custom; foreach (ConfigurationManagerAttributes item6 in hideWhenNoneAttributes) { item6.Browsable = cfg.table.Value != CraftingTable.None; } ReloadConfigDisplay(); plugin.Config.Save(); } ConfigEntry itemConfig(string name, string value, string desc) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown ConfigurationManagerAttributes configurationManagerAttributes6 = new ConfigurationManagerAttributes { CustomDrawer = DrawConfigTable, Order = (order -= 1), Category = localizedName }; return config(englishName, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes6 })); } } foreach (BuildPiece registeredPiece3 in registeredPieces) { ConfigEntryBase enabledCfg = registeredPiece3.RecipeIsActive; Piece piecePrefab; if (enabledCfg != null) { piecePrefab = registeredPiece3.Prefab.GetComponent(); ConfigChanged(null, null); ((object)enabledCfg).GetType().GetEvent("SettingChanged").AddEventHandler(enabledCfg, new EventHandler(ConfigChanged)); } registeredPiece3.InitializeNewRegisteredPiece(registeredPiece3); [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(2)] void ConfigChanged(object o, EventArgs e) { piecePrefab.m_enabled = (int)enabledCfg.BoxedValue != 0; } } if (saveOnConfigSet) { plugin.Config.SaveOnConfigSet = true; plugin.Config.Save(); } void ReloadConfigDisplay() { object obj3 = configManagerType?.GetProperty("DisplayingWindow").GetValue(configManager); if (obj3 is bool && (bool)obj3) { configManagerType.GetMethod("BuildSettingList").Invoke(configManager, Array.Empty()); } } } private void InitializeNewRegisteredPiece(BuildPiece piece) { ConfigEntryBase recipeIsActive = piece.RecipeIsActive; PieceConfig cfg; Piece piecePrefab; string pieceName; if (recipeIsActive != null) { pieceConfigs.TryGetValue(piece, out cfg); piecePrefab = piece.Prefab.GetComponent(); pieceName = piecePrefab.m_name; ((object)recipeIsActive).GetType().GetEvent("SettingChanged").AddEventHandler(recipeIsActive, new EventHandler(ConfigChanged)); } void ConfigChanged(object o, EventArgs e) { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && (Object)(object)ObjectDB.instance.GetItemPrefab("YmirRemains") != (Object)null && cfg != null) { Requirement[] resources = SerializedRequirements.toPieceReqs(new SerializedRequirements(cfg.craft.Value)); piecePrefab.m_resources = resources; Piece[] array = Object.FindObjectsOfType(); foreach (Piece val in array) { if (val.m_name == pieceName) { val.m_resources = resources; } } } } } [HarmonyPriority(700)] internal static void Patch_ObjectDBInit(ObjectDB __instance) { //IL_0489: Unknown result type (might be due to invalid IL or missing references) //IL_048e: Unknown result type (might be due to invalid IL or missing references) //IL_04c1: Unknown result type (might be due to invalid IL or missing references) //IL_04f9: Expected O, but got Unknown if ((Object)(object)__instance.GetItemPrefab("YmirRemains") == (Object)null) { return; } foreach (BuildPiece registeredPiece in registeredPieces) { pieceConfigs.TryGetValue(registeredPiece, out var value); registeredPiece.Prefab.GetComponent().m_resources = SerializedRequirements.toPieceReqs((value == null) ? new SerializedRequirements(registeredPiece.RequiredItems.Requirements) : new SerializedRequirements(value.craft.Value)); foreach (ExtensionConfig extensionStation in registeredPiece.Extension.ExtensionStations) { switch ((value == null || registeredPiece.Extension.ExtensionStations.Count > 1) ? extensionStation.Table : value.extensionTable.Value) { case CraftingTable.None: registeredPiece.Prefab.GetComponent().m_craftingStation = null; break; case CraftingTable.Custom: { GameObject prefab = ZNetScene.instance.GetPrefab((value == null || registeredPiece.Extension.ExtensionStations.Count > 0) ? extensionStation.custom : value.customExtentionTable.Value); if (prefab != null) { registeredPiece.Prefab.GetComponent().m_craftingStation = prefab.GetComponent(); } else { Debug.LogWarning((object)("Custom crafting station '" + ((value == null || registeredPiece.Extension.ExtensionStations.Count > 0) ? extensionStation.custom : value.customExtentionTable.Value) + "' does not exist")); } break; } default: if (value != null && value.table.Value == CraftingTable.None) { registeredPiece.Prefab.GetComponent().m_craftingStation = null; } else { registeredPiece.Prefab.GetComponent().m_craftingStation = ZNetScene.instance.GetPrefab(((InternalName)typeof(CraftingTable).GetMember(((value == null || registeredPiece.Extension.ExtensionStations.Count > 1) ? extensionStation.Table : value.extensionTable.Value).ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).GetComponent(); } break; } } foreach (CraftingStationConfig station in registeredPiece.Crafting.Stations) { switch ((value == null || registeredPiece.Crafting.Stations.Count > 1) ? station.Table : value.table.Value) { case CraftingTable.None: registeredPiece.Prefab.GetComponent().m_craftingStation = null; break; case CraftingTable.Custom: { GameObject prefab2 = ZNetScene.instance.GetPrefab((value == null || registeredPiece.Crafting.Stations.Count > 0) ? station.custom : value.customTable.Value); if (prefab2 != null) { registeredPiece.Prefab.GetComponent().m_craftingStation = prefab2.GetComponent(); } else { Debug.LogWarning((object)("Custom crafting station '" + ((value == null || registeredPiece.Crafting.Stations.Count > 0) ? station.custom : value.customTable.Value) + "' does not exist")); } break; } default: if (value != null && value.table.Value == CraftingTable.None) { registeredPiece.Prefab.GetComponent().m_craftingStation = null; } else { registeredPiece.Prefab.GetComponent().m_craftingStation = ZNetScene.instance.GetPrefab(((InternalName)typeof(CraftingTable).GetMember(((value == null || registeredPiece.Crafting.Stations.Count > 1) ? station.Table : value.table.Value).ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).GetComponent(); } break; } } registeredPiece.conversions = new List(); for (int i = 0; i < registeredPiece.Conversions.Count; i++) { Conversion conversion = registeredPiece.Conversions[i]; registeredPiece.conversions.Add(new ItemConversion { m_from = SerializedRequirements.fetchByName(ObjectDB.instance, conversion.config?.input.Value ?? conversion.Input), m_to = SerializedRequirements.fetchByName(ObjectDB.instance, conversion.config?.output.Value ?? conversion.Output) }); if (registeredPiece.conversions[i].m_from != null && registeredPiece.conversions[i].m_to != null) { registeredPiece.Prefab.GetComponent().m_conversion.Add(registeredPiece.conversions[i]); } } } } public void Snapshot(float lightIntensity = 1.3f, Quaternion? cameraRotation = null) { SnapshotPiece(Prefab, lightIntensity, cameraRotation); } internal void SnapshotPiece(GameObject prefab, float lightIntensity = 1.3f, Quaternion? cameraRotation = null) { //IL_0055: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0121: 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_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_0322: Unknown result type (might be due to invalid IL or missing references) //IL_0333: Unknown result type (might be due to invalid IL or missing references) //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_036f: Unknown result type (might be due to invalid IL or missing references) //IL_0376: Expected O, but got Unknown //IL_0394: Unknown result type (might be due to invalid IL or missing references) //IL_03d5: Unknown result type (might be due to invalid IL or missing references) //IL_03da: Unknown result type (might be due to invalid IL or missing references) //IL_03e4: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)prefab == (Object)null) && (prefab.GetComponentsInChildren().Any() || prefab.GetComponentsInChildren().Any())) { Camera component = new GameObject("CameraIcon", new Type[1] { typeof(Camera) }).GetComponent(); component.backgroundColor = Color.clear; component.clearFlags = (CameraClearFlags)2; ((Component)component).transform.position = new Vector3(10000f, 10000f, 10000f); ((Component)component).transform.rotation = (Quaternion)(((??)cameraRotation) ?? Quaternion.Euler(0f, 180f, 0f)); component.fieldOfView = 0.5f; component.farClipPlane = 100000f; component.cullingMask = 8; Light component2 = new GameObject("LightIcon", new Type[1] { typeof(Light) }).GetComponent(); ((Component)component2).transform.position = new Vector3(10000f, 10000f, 10000f); ((Component)component2).transform.rotation = Quaternion.Euler(5f, 180f, 5f); component2.type = (LightType)1; component2.cullingMask = 8; component2.intensity = lightIntensity; GameObject val = Object.Instantiate(prefab); Transform[] componentsInChildren = val.GetComponentsInChildren(); foreach (Transform val2 in componentsInChildren) { ((Component)val2).gameObject.layer = 3; } val.transform.position = Vector3.zero; val.transform.rotation = Quaternion.Euler(23f, 51f, 25.8f); ((Object)val).name = ((Object)prefab).name; MeshRenderer[] componentsInChildren2 = val.GetComponentsInChildren(); Vector3 val3 = componentsInChildren2.Aggregate(Vector3.positiveInfinity, [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Vector3 cur, MeshRenderer renderer) => { //IL_0000: 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_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: 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) Bounds bounds2 = ((Renderer)renderer).bounds; return Vector3.Min(cur, ((Bounds)(ref bounds2)).min); }); Vector3 val4 = componentsInChildren2.Aggregate(Vector3.negativeInfinity, [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Vector3 cur, MeshRenderer renderer) => { //IL_0000: 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_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: 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) Bounds bounds = ((Renderer)renderer).bounds; return Vector3.Max(cur, ((Bounds)(ref bounds)).max); }); val.transform.position = new Vector3(10000f, 10000f, 10000f) - (val3 + val4) / 2f; Vector3 val5 = val4 - val3; TimedDestruction val6 = val.AddComponent(); val6.Trigger(1f); Rect val7 = default(Rect); ((Rect)(ref val7))..ctor(0f, 0f, 128f, 128f); component.targetTexture = RenderTexture.GetTemporary((int)((Rect)(ref val7)).width, (int)((Rect)(ref val7)).height); component.fieldOfView = 20f; float num = Mathf.Max(val5.x, val5.y) + 0.1f; float num2 = num / Mathf.Tan(component.fieldOfView * ((float)Math.PI / 180f)) * 1.1f; ((Component)component).transform.position = new Vector3(10000f, 10000f, 10000f) + new Vector3(0f, 0f, num2); component.Render(); RenderTexture active = RenderTexture.active; RenderTexture.active = component.targetTexture; Texture2D val8 = new Texture2D((int)((Rect)(ref val7)).width, (int)((Rect)(ref val7)).height, (TextureFormat)4, false); val8.ReadPixels(new Rect(0f, 0f, (float)(int)((Rect)(ref val7)).width, (float)(int)((Rect)(ref val7)).height), 0, 0); val8.Apply(); RenderTexture.active = active; prefab.GetComponent().m_icon = Sprite.Create(val8, new Rect(0f, 0f, (float)(int)((Rect)(ref val7)).width, (float)(int)((Rect)(ref val7)).height), Vector2.one / 2f); ((Component)component2).gameObject.SetActive(false); component.targetTexture.Release(); ((Component)component).gameObject.SetActive(false); val.SetActive(false); Object.DestroyImmediate((Object)(object)val); Object.Destroy((Object)(object)component); Object.Destroy((Object)(object)component2); Object.Destroy((Object)(object)((Component)component).gameObject); Object.Destroy((Object)(object)((Component)component2).gameObject); } } private static void DrawConfigTable(ConfigEntryBase cfg) { //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Expected O, but got Unknown //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Expected O, but got Unknown //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Expected O, but got Unknown //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Expected O, but got Unknown bool valueOrDefault = cfg.Description.Tags.Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object a) => (a.GetType().Name == "ConfigurationManagerAttributes") ? ((bool?)a.GetType().GetField("ReadOnly")?.GetValue(a)) : null).FirstOrDefault((bool? v) => v.HasValue).GetValueOrDefault(); List list = new List(); bool flag = false; int num = (int)(configManager?.GetType().GetProperty("RightColumnWidth", BindingFlags.Instance | BindingFlags.NonPublic).GetGetMethod(nonPublic: true) .Invoke(configManager, Array.Empty()) ?? ((object)130)); GUILayout.BeginVertical(Array.Empty()); foreach (Requirement req in new SerializedRequirements((string)cfg.BoxedValue).Reqs) { GUILayout.BeginHorizontal(Array.Empty()); int num2 = req.amount; if (int.TryParse(GUILayout.TextField(num2.ToString(), new GUIStyle(GUI.skin.textField) { fixedWidth = 40f }, Array.Empty()), out var result) && result != num2 && !valueOrDefault) { num2 = result; flag = true; } string text = GUILayout.TextField(req.itemName, new GUIStyle(GUI.skin.textField) { fixedWidth = num - 40 - 67 - 21 - 21 - 12 }, Array.Empty()); string text2 = (valueOrDefault ? req.itemName : text); flag = flag || text2 != req.itemName; bool flag2 = req.recover; if (GUILayout.Toggle(req.recover, "Recover", new GUIStyle(GUI.skin.toggle) { fixedWidth = 67f }, Array.Empty()) != req.recover) { flag2 = !flag2; flag = true; } if (GUILayout.Button("x", new GUIStyle(GUI.skin.button) { fixedWidth = 21f }, Array.Empty()) && !valueOrDefault) { flag = true; } else { list.Add(new Requirement { amount = num2, itemName = text2, recover = flag2 }); } if (GUILayout.Button("+", new GUIStyle(GUI.skin.button) { fixedWidth = 21f }, Array.Empty()) && !valueOrDefault) { flag = true; list.Add(new Requirement { amount = 1, itemName = "", recover = false }); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); if (flag) { cfg.BoxedValue = new SerializedRequirements(list).ToString(); } } private static ConfigEntry config<[Nullable(2)] T>(string group, string name, T value, ConfigDescription description) { ConfigEntry val = plugin.Config.Bind(group, name, value, description); configSync?.GetType().GetMethod("AddConfigEntry").MakeGenericMethod(typeof(T)) .Invoke(configSync, new object[1] { val }); return val; } private static ConfigEntry config<[Nullable(2)] T>(string group, string name, T value, string description) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty())); } } public static class GoExtensions { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] public static T GetOrAddComponent<[Nullable(0)] T>(this GameObject gameObject) where T : Component { return gameObject.GetComponent() ?? gameObject.AddComponent(); } } [PublicAPI] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public class LocalizeKey { private static readonly List keys = new List(); public readonly string Key; public readonly Dictionary Localizations = new Dictionary(); public LocalizeKey(string key) { Key = key.Replace("$", ""); keys.Add(this); } public void Alias(string alias) { Localizations.Clear(); if (!alias.Contains("$")) { alias = "$" + alias; } Localizations["alias"] = alias; if (Localization.m_instance != null) { Localization.instance.AddWord(Key, Localization.instance.Localize(alias)); } } public LocalizeKey English(string key) { return addForLang("English", key); } public LocalizeKey Swedish(string key) { return addForLang("Swedish", key); } public LocalizeKey French(string key) { return addForLang("French", key); } public LocalizeKey Italian(string key) { return addForLang("Italian", key); } public LocalizeKey German(string key) { return addForLang("German", key); } public LocalizeKey Spanish(string key) { return addForLang("Spanish", key); } public LocalizeKey Russian(string key) { return addForLang("Russian", key); } public LocalizeKey Romanian(string key) { return addForLang("Romanian", key); } public LocalizeKey Bulgarian(string key) { return addForLang("Bulgarian", key); } public LocalizeKey Macedonian(string key) { return addForLang("Macedonian", key); } public LocalizeKey Finnish(string key) { return addForLang("Finnish", key); } public LocalizeKey Danish(string key) { return addForLang("Danish", key); } public LocalizeKey Norwegian(string key) { return addForLang("Norwegian", key); } public LocalizeKey Icelandic(string key) { return addForLang("Icelandic", key); } public LocalizeKey Turkish(string key) { return addForLang("Turkish", key); } public LocalizeKey Lithuanian(string key) { return addForLang("Lithuanian", key); } public LocalizeKey Czech(string key) { return addForLang("Czech", key); } public LocalizeKey Hungarian(string key) { return addForLang("Hungarian", key); } public LocalizeKey Slovak(string key) { return addForLang("Slovak", key); } public LocalizeKey Polish(string key) { return addForLang("Polish", key); } public LocalizeKey Dutch(string key) { return addForLang("Dutch", key); } public LocalizeKey Portuguese_European(string key) { return addForLang("Portuguese_European", key); } public LocalizeKey Portuguese_Brazilian(string key) { return addForLang("Portuguese_Brazilian", key); } public LocalizeKey Chinese(string key) { return addForLang("Chinese", key); } public LocalizeKey Japanese(string key) { return addForLang("Japanese", key); } public LocalizeKey Korean(string key) { return addForLang("Korean", key); } public LocalizeKey Hindi(string key) { return addForLang("Hindi", key); } public LocalizeKey Thai(string key) { return addForLang("Thai", key); } public LocalizeKey Abenaki(string key) { return addForLang("Abenaki", key); } public LocalizeKey Croatian(string key) { return addForLang("Croatian", key); } public LocalizeKey Georgian(string key) { return addForLang("Georgian", key); } public LocalizeKey Greek(string key) { return addForLang("Greek", key); } public LocalizeKey Serbian(string key) { return addForLang("Serbian", key); } public LocalizeKey Ukrainian(string key) { return addForLang("Ukrainian", key); } private LocalizeKey addForLang(string lang, string value) { Localizations[lang] = value; if (Localization.m_instance != null) { if (Localization.instance.GetSelectedLanguage() == lang) { Localization.instance.AddWord(Key, value); } else if (lang == "English" && !Localization.instance.m_translations.ContainsKey(Key)) { Localization.instance.AddWord(Key, value); } } return this; } [HarmonyPriority(300)] internal static void AddLocalizedKeys(Localization __instance, string language) { foreach (LocalizeKey key in keys) { string value2; if (key.Localizations.TryGetValue(language, out var value) || key.Localizations.TryGetValue("English", out value)) { __instance.AddWord(key.Key, value); } else if (key.Localizations.TryGetValue("alias", out value2)) { __instance.AddWord(key.Key, Localization.instance.Localize(value2)); } } } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public static class LocalizationCache { private static readonly Dictionary localizations = new Dictionary(); internal static void LocalizationPostfix(Localization __instance, string language) { string key = localizations.FirstOrDefault([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (KeyValuePair l) => l.Value == __instance).Key; if (key != null) { localizations.Remove(key); } if (!localizations.ContainsKey(language)) { localizations.Add(language, __instance); } } public static Localization ForLanguage([Nullable(2)] string language = null) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (localizations.TryGetValue(language ?? PlayerPrefs.GetString("language", "English"), out var value)) { return value; } value = new Localization(); if (language != null) { value.SetupLanguage(language); } return value; } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public class AdminSyncing { [CompilerGenerated] private sealed class <g__WatchAdminListChanges|2_0>d : IEnumerator, IDisposable, IEnumerator { private int <>1__state; [Nullable(0)] private object <>2__current; [Nullable(new byte[] { 0, 1 })] private List 5__1; [Nullable(new byte[] { 0, 1 })] private List 5__2; [Nullable(new byte[] { 0, 1 })] private List 5__3; object IEnumerator.Current { [DebuggerHidden] [return: Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public <g__WatchAdminListChanges|2_0>d(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__1 = null; 5__2 = null; 5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; if (!ZNet.instance.m_adminList.GetList().SequenceEqual(5__1)) { 5__1 = new List(ZNet.instance.m_adminList.GetList()); 5__2 = (from p in ZNet.instance.GetPeers() where ZNet.instance.ListContainsId(ZNet.instance.m_adminList, p.m_rpc.GetSocket().GetHostName()) select p).ToList(); 5__3 = ZNet.instance.GetPeers().Except(5__2).ToList(); g__SendAdmin|2_2(5__3, isAdmin: false); g__SendAdmin|2_2(5__2, isAdmin: true); 5__2 = null; 5__3 = null; } } else { <>1__state = -1; 5__1 = new List(ZNet.instance.m_adminList.GetList()); } <>2__current = (object)new WaitForSeconds(30f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <>c__DisplayClass3_0 { [Nullable(0)] public ZPackage package; [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] internal IEnumerator b__1(ZNetPeer p) { return TellPeerAdminStatus(p, package); } } [StructLayout(LayoutKind.Auto)] [CompilerGenerated] private struct <>c__DisplayClass4_0 { [Nullable(0)] public ZNetPeer peer; [Nullable(0)] public ZRoutedRpc rpc; } [CompilerGenerated] private sealed class d__4 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private bool <>2__current; [Nullable(0)] public ZNetPeer peer; [Nullable(0)] public ZPackage package; private <>c__DisplayClass4_0 <>8__1; bool IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = default(<>c__DisplayClass4_0); <>1__state = -2; } private bool MoveNext() { if (<>1__state != 0) { return false; } <>1__state = -1; <>8__1.peer = peer; <>8__1.rpc = ZRoutedRpc.instance; if (<>8__1.rpc == null) { return false; } g__SendPackage|4_0(package, ref <>8__1); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__3 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; [Nullable(0)] private object <>2__current; [Nullable(new byte[] { 0, 1 })] public List peers; [Nullable(0)] public ZPackage package; [Nullable(0)] private <>c__DisplayClass3_0 <>8__1; [Nullable(0)] private byte[] 5__2; [Nullable(new byte[] { 0, 1 })] private List> 5__3; [Nullable(0)] private ZPackage 5__4; [Nullable(0)] private MemoryStream 5__5; [Nullable(0)] private DeflateStream 5__6; object IEnumerator.Current { [DebuggerHidden] [return: Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; 5__2 = null; 5__3 = null; 5__4 = null; 5__5 = null; 5__6 = null; <>1__state = -2; } private bool MoveNext() { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass3_0(); <>8__1.package = package; if (!Object.op_Implicit((Object)(object)ZNet.instance)) { return false; } 5__2 = <>8__1.package.GetArray(); if (5__2 != null && 5__2.LongLength > 10000) { 5__4 = new ZPackage(); 5__4.Write(4); 5__5 = new MemoryStream(); 5__6 = new DeflateStream(5__5, CompressionLevel.Optimal); try { 5__6.Write(5__2, 0, 5__2.Length); } finally { if (5__6 != null) { ((IDisposable)5__6).Dispose(); } } 5__6 = null; 5__4.Write(5__5.ToArray()); <>8__1.package = 5__4; 5__4 = null; 5__5 = null; } 5__3 = (from peer in peers where peer.IsReady() select peer into p select TellPeerAdminStatus(p, <>8__1.package)).ToList(); 5__3.RemoveAll((IEnumerator writer) => !writer.MoveNext()); break; case 1: <>1__state = -1; 5__3.RemoveAll((IEnumerator writer) => !writer.MoveNext()); break; } if (5__3.Count > 0) { <>2__current = null; <>1__state = 1; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static bool isServer; internal static bool registeredOnClient; [HarmonyPriority(700)] internal static void AdminStatusSync(ZNet __instance) { isServer = __instance.IsServer(); if (BuildPiece._plugin != null) { if (isServer) { ZRoutedRpc.instance.Register(BuildPiece._plugin.Info.Metadata.Name + " PMAdminStatusSync", (Action)RPC_AdminPieceAddRemove); } else if (!registeredOnClient) { ZRoutedRpc.instance.Register(BuildPiece._plugin.Info.Metadata.Name + " PMAdminStatusSync", (Action)RPC_AdminPieceAddRemove); registeredOnClient = true; } } if (isServer) { ((MonoBehaviour)ZNet.instance).StartCoroutine(WatchAdminListChanges()); } [IteratorStateMachine(typeof(<g__WatchAdminListChanges|2_0>d))] static IEnumerator WatchAdminListChanges() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <g__WatchAdminListChanges|2_0>d(0); } } [IteratorStateMachine(typeof(d__3))] private static IEnumerator sendZPackage(List peers, ZPackage package) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__3(0) { peers = peers, package = package }; } [IteratorStateMachine(typeof(d__4))] private static IEnumerator TellPeerAdminStatus(ZNetPeer peer, ZPackage package) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__4(0) { peer = peer, package = package }; } internal static void RPC_AdminPieceAddRemove(long sender, ZPackage package) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown ZNetPeer peer = ZNet.instance.GetPeer(sender); bool flag = false; try { flag = package.ReadBool(); } catch { } if (isServer) { ZRoutedRpc instance = ZRoutedRpc.instance; long everybody = ZRoutedRpc.Everybody; BaseUnityPlugin plugin = BuildPiece._plugin; instance.InvokeRoutedRPC(everybody, ((plugin != null) ? plugin.Info.Metadata.Name : null) + " PMAdminStatusSync", new object[1] { (object)new ZPackage() }); if (ZNet.instance.ListContainsId(ZNet.instance.m_adminList, peer.m_rpc.GetSocket().GetHostName())) { ZPackage val = new ZPackage(); val.Write(true); ZRpc rpc = peer.m_rpc; BaseUnityPlugin plugin2 = BuildPiece._plugin; rpc.Invoke(((plugin2 != null) ? plugin2.Info.Metadata.Name : null) + " PMAdminStatusSync", new object[1] { val }); } return; } foreach (BuildPiece registeredPiece in BuildPiece.registeredPieces) { if (!registeredPiece.SpecialProperties.AdminOnly) { continue; } Piece component = registeredPiece.Prefab.GetComponent(); string name = component.m_name; string text = Localization.instance.Localize(name).Trim(); if (!Object.op_Implicit((Object)(object)ObjectDB.instance) || (Object)(object)ObjectDB.instance.GetItemPrefab("YmirRemains") == (Object)null) { continue; } Piece[] array = Object.FindObjectsOfType(); foreach (Piece val2 in array) { if (flag) { if (val2.m_name == name) { val2.m_enabled = true; } } else if (val2.m_name == name) { val2.m_enabled = false; } } List pieces = ObjectDB.instance.GetItemPrefab("Hammer").GetComponent().m_itemData.m_shared.m_buildPieces.m_pieces; if (flag) { if (!pieces.Contains(ZNetScene.instance.GetPrefab(((Object)component).name))) { pieces.Add(ZNetScene.instance.GetPrefab(((Object)component).name)); } } else if (pieces.Contains(ZNetScene.instance.GetPrefab(((Object)component).name))) { pieces.Remove(ZNetScene.instance.GetPrefab(((Object)component).name)); } } } [CompilerGenerated] internal static void g__SendAdmin|2_2(List peers, bool isAdmin) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ZPackage val = new ZPackage(); val.Write(isAdmin); ((MonoBehaviour)ZNet.instance).StartCoroutine(sendZPackage(peers, val)); } [CompilerGenerated] internal static void g__SendPackage|4_0(ZPackage pkg, ref <>c__DisplayClass4_0 P_1) { BaseUnityPlugin plugin = BuildPiece._plugin; string text = ((plugin != null) ? plugin.Info.Metadata.Name : null) + " PMAdminStatusSync"; if (isServer) { P_1.peer.m_rpc.Invoke(text, new object[1] { pkg }); } else { P_1.rpc.InvokeRoutedRPC(P_1.peer.m_server ? 0 : P_1.peer.m_uid, text, new object[1] { pkg }); } } } [Nullable(0)] [HarmonyPatch(typeof(ZNet), "OnNewConnection")] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] internal class RegisterClientRPCPatch { private static void Postfix(ZNet __instance, ZNetPeer peer) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown if (!__instance.IsServer()) { ZRpc rpc = peer.m_rpc; BaseUnityPlugin plugin = BuildPiece._plugin; rpc.Register(((plugin != null) ? plugin.Info.Metadata.Name : null) + " PMAdminStatusSync", (Action)RPC_InitialAdminSync); return; } ZPackage val = new ZPackage(); val.Write(__instance.ListContainsId(__instance.m_adminList, peer.m_rpc.GetSocket().GetHostName())); ZRpc rpc2 = peer.m_rpc; BaseUnityPlugin plugin2 = BuildPiece._plugin; rpc2.Invoke(((plugin2 != null) ? plugin2.Info.Metadata.Name : null) + " PMAdminStatusSync", new object[1] { val }); } private static void RPC_InitialAdminSync(ZRpc rpc, ZPackage package) { AdminSyncing.RPC_AdminPieceAddRemove(0L, package); } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public static class PiecePrefabManager { [Nullable(0)] private struct BundleId { [UsedImplicitly] public string assetBundleFileName; [UsedImplicitly] public string folderName; } private static readonly Dictionary bundleCache; private static readonly List piecePrefabs; private static readonly Dictionary PieceCategories; private static readonly Dictionary OtherPieceCategories; private static readonly Dictionary VanillaLabels; internal static bool CategoryRefreshNeeded; static PiecePrefabManager() { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Expected O, but got Unknown //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Expected O, but got Unknown //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Expected O, but got Unknown //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Expected O, but got Unknown //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Expected O, but got Unknown //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Expected O, but got Unknown //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Expected O, but got Unknown //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Expected O, but got Unknown //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Expected O, but got Unknown //IL_02eb: Expected O, but got Unknown //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_0327: Expected O, but got Unknown //IL_0356: Unknown result type (might be due to invalid IL or missing references) //IL_0363: Expected O, but got Unknown //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_039f: Expected O, but got Unknown //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03db: Expected O, but got Unknown //IL_040a: Unknown result type (might be due to invalid IL or missing references) //IL_0417: Expected O, but got Unknown //IL_0446: Unknown result type (might be due to invalid IL or missing references) //IL_0453: Expected O, but got Unknown bundleCache = new Dictionary(); piecePrefabs = new List(); PieceCategories = new Dictionary(); OtherPieceCategories = new Dictionary(); VanillaLabels = new Dictionary(); Harmony val = new Harmony("org.bepinex.helpers.PieceManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(BuildPiece), "Patch_FejdStartup", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizeKey), "AddLocalizedKeys", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "SetupLanguage", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizationCache), "LocalizationPostfix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ObjectDB), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Patch_ObjectDBInit", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ObjectDB), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(BuildPiece), "Patch_ObjectDBInit", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ObjectDB), "CopyOtherDB", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Patch_ObjectDBInit", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNet), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(AdminSyncing), "AdminStatusSync", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Patch_ZNetSceneAwake", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "RefFixPatch_ZNetSceneAwake", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(PieceTable), "UpdateAvailable", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "UpdateAvailable_Transpiler", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(PieceTable), "UpdateAvailable", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "UpdateAvailable_Prefix", (Type[])null, (Type[])null)), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "UpdateAvailable_Postfix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Player), "SetPlaceMode", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Patch_SetPlaceMode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Hud), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Hud_AwakeCreateTabs", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Hud), "UpdateBuild", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "RepositionCatsIfNeeded", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Hud), "LateUpdate", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "RepositionCatsIfNeeded", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Enum), "GetValues", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "EnumGetValuesPatch", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Enum), "GetNames", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "EnumGetNamesPatch", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } public static AssetBundle RegisterAssetBundle(string assetBundleFileName, string folderName = "assets") { BundleId bundleId = default(BundleId); bundleId.assetBundleFileName = assetBundleFileName; bundleId.folderName = folderName; BundleId key = bundleId; if (!bundleCache.TryGetValue(key, out var value)) { Dictionary dictionary = bundleCache; AssetBundle? obj = ((IEnumerable)Resources.FindObjectsOfTypeAll()).FirstOrDefault((Func)([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (AssetBundle a) => ((Object)a).name == assetBundleFileName)) ?? AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + "." + folderName + "." + assetBundleFileName)); AssetBundle result = obj; dictionary[key] = obj; return result; } return value; } public static IEnumerable FixRefs(AssetBundle assetBundle) { return assetBundle.LoadAllAssets(); } public static GameObject RegisterPrefab(string assetBundleFileName, string prefabName, string folderName = "assets") { return RegisterPrefab(RegisterAssetBundle(assetBundleFileName, folderName), prefabName); } public static GameObject RegisterPrefab(AssetBundle assets, string prefabName) { if ((Object)(object)assets == (Object)null) { Debug.LogError((object)"Failed to load asset bundle. Please make sure to mark all asset bundles as embedded resources."); return null; } GameObject val = assets.LoadAsset(prefabName); if ((Object)(object)val == (Object)null) { Debug.LogError((object)("Failed to load prefab " + prefabName + " from asset bundle " + ((Object)assets).name)); return null; } piecePrefabs.Add(val); return val; } public static Sprite RegisterSprite(string assetBundleFileName, string prefabName, string folderName = "assets") { return RegisterSprite(RegisterAssetBundle(assetBundleFileName, folderName), prefabName); } public static Sprite RegisterSprite(AssetBundle assets, string prefabName) { return assets.LoadAsset(prefabName); } private static void EnumGetValuesPatch(Type enumType, ref Array __result) { if (!(enumType != typeof(PieceCategory)) && PieceCategories.Count != 0) { PieceCategory[] array = (PieceCategory[])(object)new PieceCategory[__result.Length + PieceCategories.Count]; __result.CopyTo(array, 0); PieceCategories.Values.CopyTo(array, __result.Length); __result = array; } } private static void EnumGetNamesPatch(Type enumType, ref string[] __result) { if (!(enumType != typeof(PieceCategory)) && PieceCategories.Count != 0) { __result = CollectionExtensions.AddRangeToArray(__result, PieceCategories.Keys.ToArray()); } } public static Dictionary GetPieceCategoriesMap() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) Array values = Enum.GetValues(typeof(PieceCategory)); string[] names = Enum.GetNames(typeof(PieceCategory)); Dictionary dictionary = new Dictionary(); for (int i = 0; i < values.Length; i++) { dictionary[(PieceCategory)values.GetValue(i)] = names[i]; } return dictionary; } public static PieceCategory GetCategory(string name) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: 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_00dd: 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) if (Enum.TryParse(name, ignoreCase: true, out PieceCategory result)) { return result; } if (PieceCategories.TryGetValue(name, out result)) { return result; } if (OtherPieceCategories.TryGetValue(name, out result)) { return result; } Dictionary pieceCategoriesMap = GetPieceCategoriesMap(); foreach (KeyValuePair item in pieceCategoriesMap) { if (item.Value == name) { result = item.Key; OtherPieceCategories[name] = result; return result; } } result = (PieceCategory)(pieceCategoriesMap.Count - 1); PieceCategories[name] = result; string categoryToken = GetCategoryToken(name); Localization.instance.AddWord(categoryToken, name); return result; } internal static void CreateCategoryTabs() { if (Object.op_Implicit((Object)(object)Hud.instance)) { int num = ModifiedMaxCategory(); for (int i = Hud.instance.m_pieceCategoryTabs.Length; i < num; i++) { GameObject val = CreateCategoryTab(); Hud.instance.m_pieceCategoryTabs = CollectionExtensions.AddItem((IEnumerable)Hud.instance.m_pieceCategoryTabs, val).ToArray(); } if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && Object.op_Implicit((Object)(object)Player.m_localPlayer.m_buildPieces)) { RepositionCategories(Player.m_localPlayer.m_buildPieces); Player.m_localPlayer.UpdateAvailablePiecesList(); } } } private static GameObject CreateCategoryTab() { //IL_0084: 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) GameObject val = Hud.instance.m_pieceCategoryTabs[0]; GameObject val2 = Object.Instantiate(Hud.instance.m_pieceCategoryTabs[0], val.transform.parent); val2.SetActive(false); UIInputHandler orAddComponent = val2.GetOrAddComponent(); orAddComponent.m_onLeftDown = (Action)Delegate.Combine(orAddComponent.m_onLeftDown, new Action(Hud.instance.OnLeftClickCategory)); TMP_Text[] componentsInChildren = val2.GetComponentsInChildren(); foreach (TMP_Text val3 in componentsInChildren) { val3.rectTransform.offsetMin = new Vector2(3f, 1f); val3.rectTransform.offsetMax = new Vector2(-3f, -1f); val3.enableAutoSizing = true; val3.fontSizeMin = 12f; val3.fontSizeMax = 20f; val3.lineSpacing = 0.8f; val3.textWrappingMode = (TextWrappingModes)1; val3.overflowMode = (TextOverflowModes)3; } return val2; } private static int ModifiedMaxCategory() { return Enum.GetValues(typeof(PieceCategory)).Length - 1; } private static int GetMaxCategoryOrDefault() { try { return (int)Enum.Parse(typeof(PieceCategory), "Max"); } catch (ArgumentException) { Debug.LogWarning((object)"Could not find Piece.PieceCategory.Max, using fallback value 4"); return 4; } } private static List TranspileMaxCategory(IEnumerable instructions, int maxOffset) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown int num = GetMaxCategoryOrDefault() + maxOffset; List list = new List(); foreach (CodeInstruction instruction in instructions) { if (CodeInstructionExtensions.LoadsConstant(instruction, (long)num)) { list.Add(new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "ModifiedMaxCategory", (Type[])null, (Type[])null))); if (maxOffset != 0) { list.Add(new CodeInstruction(OpCodes.Ldc_I4, (object)maxOffset)); list.Add(new CodeInstruction(OpCodes.Add, (object)null)); } } else { list.Add(instruction); } } return list; } private static IEnumerable UpdateAvailable_Transpiler(IEnumerable instructions) { return TranspileMaxCategory(instructions, 0); } private static HashSet CategoriesInPieceTable(PieceTable pieceTable) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) HashSet hashSet = new HashSet(); Piece val = default(Piece); foreach (GameObject item in pieceTable.m_pieces.Where([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (GameObject pieceFab) => (Object)(object)pieceFab != (Object)null)) { if (item.TryGetComponent(ref val)) { hashSet.Add(val.m_category); } } return hashSet; } private static void RepositionCatsIfNeeded() { if (CategoryRefreshNeeded) { CategoryRefreshNeeded = false; CreateCategoryTabs(); RepositionCats(); } } private static void RepositionCats() { if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && Object.op_Implicit((Object)(object)Player.m_localPlayer.m_buildPieces)) { RepositionCategories(Player.m_localPlayer.m_buildPieces); } } private static void RepositionCategories(PieceTable pieceTable) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: 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_020a: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0286: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Expected O, but got Unknown //IL_029b: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) RectTransform val = (RectTransform)Hud.instance.m_pieceCategoryTabs[0].transform; RectTransform val2 = (RectTransform)Hud.instance.m_pieceCategoryRoot.transform; RectTransform val3 = (RectTransform)Hud.instance.m_pieceSelectionWindow.transform; HorizontalLayoutGroup val4 = default(HorizontalLayoutGroup); if (((Component)((Transform)val).parent).TryGetComponent(ref val4)) { Object.DestroyImmediate((Object)(object)val4); } Rect rect = val.rect; Vector2 size = ((Rect)(ref rect)).size; GridLayoutGroup val5 = default(GridLayoutGroup); GridLayoutGroup val6 = (((Component)((Transform)val).parent).TryGetComponent(ref val5) ? val5 : ((Component)((Transform)val).parent).gameObject.AddComponent()); val6.cellSize = size; val6.spacing = new Vector2(0f, 1f); val6.constraint = (Constraint)1; val6.constraintCount = 5; ((LayoutGroup)val6).childAlignment = (TextAnchor)4; HashSet hashSet = CategoriesInPieceTable(pieceTable); UpdatePieceTableCategories(pieceTable, hashSet); rect = val2.rect; int num = Mathf.Max((int)(((Rect)(ref rect)).width / size.x), 1); int count = pieceTable.m_categories.Count; float num2 = (0f - size.x) * (float)num / 2f + size.x / 2f; float num3 = (size.y + 1f) * Mathf.Floor((float)(count - 1) / (float)num) + 5f; Vector2 val7 = default(Vector2); ((Vector2)(ref val7))..ctor(num2, num3); int num4 = Mathf.CeilToInt((float)count / (float)num); float num5 = (size.y + 1f) * (float)num4; RectTransform component = ((Component)((Transform)val).parent).GetComponent(); component.anchoredPosition = new Vector2(component.anchoredPosition.x, num5 / 2f); int num6 = 0; for (int i = 0; i < Hud.instance.m_pieceCategoryTabs.Length; i++) { GameObject val8 = Hud.instance.m_pieceCategoryTabs[i]; if ((Object)(object)val8 == (Object)null) { continue; } if (i >= pieceTable.m_categories.Count) { val8.SetActive(false); continue; } PieceCategory item = pieceTable.m_categories[i]; string text = pieceTable.m_categoryLabels[i]; if (hashSet.Contains(item)) { num6++; } val8.GetComponentInChildren().text = Localization.instance.Localize(text); } Transform obj = ((Transform)val3).Find("Bkg2"); RectTransform val9 = (RectTransform)((obj != null) ? ((Component)obj).transform : null); if (Object.op_Implicit((Object)(object)val9)) { float num7 = (size.y + 1f) * (float)Mathf.Max(0, Mathf.FloorToInt((float)(num6 - 1) / (float)num)); val9.offsetMax = new Vector2(val9.offsetMax.x, num7); } else { Debug.LogWarning((object)"RefreshCategories: Could not find background image"); } ((Component)Hud.instance).GetComponentInParent().RefreshLocalization(); } private static void UpdatePieceTableCategories(PieceTable pieceTable, HashSet visibleCategories) { //IL_000a: 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_001a: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: 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_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < GetMaxCategoryOrDefault(); i++) { PieceCategory val = (PieceCategory)i; if (visibleCategories.Contains(val) && !pieceTable.m_categories.Contains(val)) { pieceTable.m_categories.Add(val); pieceTable.m_categoryLabels.Add(GetVanillaLabel(val)); } if (!visibleCategories.Contains(val) && pieceTable.m_categories.Contains(val)) { int index = pieceTable.m_categories.IndexOf(val); pieceTable.m_categories.RemoveAt(index); pieceTable.m_categoryLabels.RemoveAt(index); } } foreach (KeyValuePair pieceCategory in PieceCategories) { string key = pieceCategory.Key; PieceCategory value = pieceCategory.Value; if (visibleCategories.Contains(value) && !pieceTable.m_categories.Contains(value)) { pieceTable.m_categories.Add(value); pieceTable.m_categoryLabels.Add("$" + GetCategoryToken(key)); } if (visibleCategories.Contains(value) && !pieceTable.m_categoryLabels.Contains("$" + GetCategoryToken(key))) { pieceTable.m_categoryLabels.Add("$" + GetCategoryToken(key)); } if (!visibleCategories.Contains(value) && pieceTable.m_categories.Contains(value)) { int index2 = pieceTable.m_categories.IndexOf(value); pieceTable.m_categories.RemoveAt(index2); pieceTable.m_categoryLabels.RemoveAt(index2); } } } private static string GetVanillaLabel(PieceCategory category) { //IL_0006: 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) if (!VanillaLabels.ContainsKey(category)) { SearchVanillaLabels(); } string value; return VanillaLabels.TryGetValue(category, out value) ? value : string.Empty; } private static void SearchVanillaLabels() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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) PieceTable[] array = Resources.FindObjectsOfTypeAll(); foreach (PieceTable val in array) { for (int j = 0; j < val.m_categories.Count; j++) { PieceCategory key = val.m_categories[j]; if (j < val.m_categoryLabels.Count && !VanillaLabels.ContainsKey(key) && !string.IsNullOrEmpty(val.m_categoryLabels[j])) { VanillaLabels[key] = val.m_categoryLabels[j]; } } } } private static string GetCategoryToken(string name) { char[] endChars = Localization.instance.m_endChars; string text = string.Concat(name.ToLower().Split(endChars)); return "piecemanager_cat_" + text; } private static void Patch_SetPlaceMode(Player __instance) { if (Object.op_Implicit((Object)(object)__instance.m_buildPieces)) { RepositionCategories(__instance.m_buildPieces); } } private static void UpdateAvailable_Prefix(PieceTable __instance) { if (__instance.m_availablePieces.Count > 0) { int num = ModifiedMaxCategory() - __instance.m_availablePieces.Count; for (int i = 0; i < num; i++) { __instance.m_availablePieces.Add(new List()); } } } private static void UpdateAvailable_Postfix(PieceTable __instance) { Array.Resize(ref __instance.m_selectedPiece, __instance.m_availablePieces.Count); Array.Resize(ref __instance.m_lastSelectedPiece, __instance.m_availablePieces.Count); } [HarmonyPriority(200)] private static void Hud_AwakeCreateTabs() { CreateCategoryTabs(); } [HarmonyPriority(700)] private static void Patch_ZNetSceneAwake(ZNetScene __instance) { foreach (GameObject piecePrefab in piecePrefabs) { if (!__instance.m_prefabs.Contains(piecePrefab)) { __instance.m_prefabs.Add(piecePrefab); } } } [HarmonyPriority(700)] private static void RefFixPatch_ZNetSceneAwake(ZNetScene __instance) { //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) foreach (GameObject piecePrefab in piecePrefabs) { if (__instance.m_prefabs.Contains(piecePrefab) && Object.op_Implicit((Object)(object)piecePrefab.GetComponent())) { piecePrefab.GetComponent().m_isUpgrade = true; piecePrefab.GetComponent().m_connectionPrefab = __instance.GetPrefab("piece_workbench_ext3").GetComponent().m_connectionPrefab; piecePrefab.GetComponent().m_connectionOffset = __instance.GetPrefab("piece_workbench_ext3").GetComponent().m_connectionOffset; } } } [HarmonyPriority(300)] private static void Patch_ObjectDBInit(ObjectDB __instance) { foreach (BuildPiece registeredPiece in BuildPiece.registeredPieces) { string[] activeTools = registeredPiece.activeTools; foreach (string text in activeTools) { GameObject itemPrefab = __instance.GetItemPrefab(text); PieceTable val = ((itemPrefab != null) ? itemPrefab.GetComponent().m_itemData.m_shared.m_buildPieces : null); if (val != null && !val.m_pieces.Contains(registeredPiece.Prefab)) { val.m_pieces.Add(registeredPiece.Prefab); } } } } } public static class PieceManagerVersion { [Nullable(1)] public const string Version = "1.2.9"; } [Nullable(0)] [PublicAPI] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] public class Conversion { [Nullable(0)] internal class ConversionConfig { public ConfigEntry input = null; public ConfigEntry output = null; } public string Input = null; public string Output = null; [Nullable(2)] internal ConversionConfig config; public Conversion(BuildPiece conversionPiece) { conversionPiece.Conversions.Add(this); } } } namespace CreatureManager { public enum Toggle { On, Off } [PublicAPI] public enum GlobalKey { [InternalName("")] None, [InternalName("defeated_bonemass")] KilledBonemass, [InternalName("defeated_gdking")] KilledElder, [InternalName("defeated_goblinking")] KilledYagluth, [InternalName("defeated_dragon")] KilledModer, [InternalName("defeated_eikthyr")] KilledEikthyr, [InternalName("KilledTroll")] KilledTroll, [InternalName("killed_surtling")] KilledSurtling } [Flags] [PublicAPI] public enum Weather { [InternalName("")] None = 0, [InternalName("Clear")] ClearSkies = 1, [InternalName("Heath clear")] MeadowsClearSkies = 4, [InternalName("LightRain")] LightRain = 8, [InternalName("Rain")] Rain = 0x10, [InternalName("ThunderStorm")] ThunderStorm = 0x20, [InternalName("nofogts")] ClearThunderStorm = 0x40, [InternalName("SwampRain")] SwampRain = 0x80, [InternalName("Darklands_dark")] MistlandsDark = 0x100, [InternalName("Ashrain")] AshlandsAshrain = 0x200, [InternalName("Snow")] MountainSnow = 0x400, [InternalName("SnowStorm")] MountainBlizzard = 0x800, [InternalName("DeepForest Mist")] BlackForestFog = 0x1000, [InternalName("Misty")] Fog = 0x2000, [InternalName("Twilight_Snow")] DeepNorthSnow = 0x4000, [InternalName("Twilight_SnowStorm")] DeepNorthSnowStorm = 0x8000, [InternalName("Twilight_Clear")] DeepNorthClear = 0x10000, [InternalName("Eikthyr")] EikyrsThunderstorm = 0x20000, [InternalName("GDKing")] EldersHaze = 0x40000, [InternalName("Bonemass")] BonemassDownpour = 0x80000, [InternalName("Moder")] ModersVortex = 0x100000, [InternalName("GoblinKing")] YagluthsMagicBlizzard = 0x200000, [InternalName("Crypt")] Crypt = 0x400000, [InternalName("SunkenCrypt")] SunkenCrypt = 0x800000 } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public class InternalName : Attribute { public readonly string internalName; public InternalName(string internalName) { this.internalName = internalName; } } public enum DropOption { Disabled, Default, Custom } public enum SpawnOption { Disabled, Default, Custom } public enum SpawnTime { Day, Night, Always } public enum SpawnArea { Center, Edge, Everywhere } public enum Forest { Yes, No, Both } [PublicAPI] public struct Range { public float min; public float max; public Range(float min, float max) { this.min = 0f; this.max = 0f; this.min = min; this.max = max; } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] [PublicAPI] public class Creature { [Nullable(0)] [PublicAPI] public class DropList { [Nullable(0)] internal class SerializedDrops { [Nullable(new byte[] { 1, 0, 1, 1 })] public readonly List> Drops; public SerializedDrops(DropList drops, Creature creature) { Drops = (drops.drops ?? creature.Prefab.GetComponent()?.m_drops.ToDictionary([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Drop drop) => ((Object)drop.m_prefab).name, [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Drop drop) => new Drop { Amount = new Range(drop.m_amountMin, drop.m_amountMax), DropChance = drop.m_chance, DropOnePerPlayer = drop.m_onePerPlayer, MultiplyDropByLevel = drop.m_levelMultiplier }) ?? new Dictionary()).ToList(); } public SerializedDrops([Nullable(new byte[] { 1, 0, 1, 1 })] List> drops) { Drops = drops; } public SerializedDrops(string reqs) { Drops = (from r in reqs.Split(new char[1] { ',' }) select r.Split(new char[1] { ':' })).ToDictionary([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (string[] l) => l[0], [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (string[] parts) => { Range amount = new Range(1f, 1f); if (parts.Length > 1) { string[] array = parts[1].Split(new char[1] { '-' }); if (!int.TryParse(array[0], out var result)) { result = 1; } if (array.Length == 1 || !int.TryParse(array[0], out var result2)) { result2 = result; } amount = new Range(result, result2); } float result3; return new Drop { Amount = amount, DropChance = ((parts.Length > 2 && float.TryParse(parts[2], out result3)) ? result3 : 100f), DropOnePerPlayer = (parts.Length > 3 && parts[3] == "onePerPlayer"), MultiplyDropByLevel = (parts.Length > 4 && parts[4] == "multiplyByLevel") }; }).ToList(); } public override string ToString() { return string.Join(",", Drops.Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (KeyValuePair kv) => string.Format("{0}:{1}-{2}:{3}:{4}:{5}", kv.Key, kv.Value.Amount.min, kv.Value.Amount.max, kv.Value.DropChance, kv.Value.DropOnePerPlayer ? "onePerPlayer" : "unrestricted", kv.Value.MultiplyDropByLevel ? "multiplyByLevel" : "unaffectedByLevel"))); } } [Nullable(new byte[] { 2, 1, 1 })] private Dictionary drops = null; public Drop this[string prefabName] { get { Drop result; if (!(drops ?? (drops = new Dictionary())).TryGetValue(prefabName, out var value)) { Drop drop2 = (drops[prefabName] = new Drop()); result = drop2; } else { result = value; } return result; } } public void None() { drops = new Dictionary(); } [HarmonyPriority(700)] internal static void AddDropsToCreature() { foreach (Creature registeredCreature in registeredCreatures) { UpdateDrops(registeredCreature); } } internal static void UpdateDrops(Creature creature) { if (!creatureConfigs.ContainsKey(creature) || creatureConfigs[creature].Drops.get == null) { return; } DropOption dropOption = creatureConfigs[creature].Drops.get(); if (dropOption == DropOption.Default && creature.Drops.drops == null) { return; } CharacterDrop val = creature.Prefab.GetComponent() ?? creature.Prefab.AddComponent(); DropOption dropOption2 = creatureConfigs[creature].Drops.get(); if (1 == 0) { } List> source = dropOption2 switch { DropOption.Custom => new SerializedDrops(creatureConfigs[creature].CustomDrops.get()).Drops, DropOption.Disabled => new List>(), _ => creature.Drops.drops.ToList(), }; if (1 == 0) { } val.m_drops = (from d in ((IEnumerable>)source).Select((Func, Drop>)([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (KeyValuePair kv) => { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: 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) //IL_00f2: Expected O, but got Unknown if (kv.Key == "" || ZNetScene.instance == null) { return null; } GameObject prefab = ZNetScene.instance.GetPrefab(kv.Key); if (prefab == null) { Debug.LogWarning((object)("Found invalid prefab name " + kv.Key + " for creature " + ((Object)creature.Prefab).name)); return null; } return new Drop { m_prefab = prefab, m_amountMin = (int)kv.Value.Amount.min, m_amountMax = (int)kv.Value.Amount.max, m_chance = kv.Value.DropChance / 100f, m_onePerPlayer = kv.Value.DropOnePerPlayer, m_levelMultiplier = kv.Value.MultiplyDropByLevel }; })) where d != null select d).ToList(); } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] [PublicAPI] public class Drop { public Range Amount = new Range(1f, 1f); public float DropChance = 100f; public bool DropOnePerPlayer = false; public bool MultiplyDropByLevel = true; } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] private class CustomConfig<[Nullable(2)] T> { [Nullable(1)] public Func get = null; [Nullable(new byte[] { 2, 1 })] public ConfigEntry config = null; } [Nullable(0)] private class CreatureConfig { public readonly CustomConfig Spawn = new CustomConfig(); public readonly CustomConfig CanBeTamed = new CustomConfig(); public readonly CustomConfig ConsumesItemName = new CustomConfig(); public readonly CustomConfig SpecificSpawnTime = new CustomConfig(); public readonly CustomConfig RequiredAltitude = new CustomConfig(); public readonly CustomConfig RequiredOceanDepth = new CustomConfig(); public readonly CustomConfig RequiredGlobalKey = new CustomConfig(); public readonly CustomConfig GroupSize = new CustomConfig(); public readonly CustomConfig Biome = new CustomConfig(); public readonly CustomConfig SpecificSpawnArea = new CustomConfig(); public readonly CustomConfig RequiredWeather = new CustomConfig(); public readonly CustomConfig SpawnAltitude = new CustomConfig(); public readonly CustomConfig CanHaveStars = new CustomConfig(); public readonly CustomConfig AttackImmediately = new CustomConfig(); public readonly CustomConfig CheckSpawnInterval = new CustomConfig(); public readonly CustomConfig SpawnChance = new CustomConfig(); public readonly CustomConfig SpawnDistance = new CustomConfig(); public readonly CustomConfig ForestSpawn = new CustomConfig(); public readonly CustomConfig Maximum = new CustomConfig(); public readonly CustomConfig Drops = new CustomConfig(); public readonly CustomConfig CustomDrops = new CustomConfig(); public readonly CustomConfig Health = new CustomConfig(); public readonly CustomConfig RegenAllHpTime = new CustomConfig(); public readonly CustomConfig BluntModifier = new CustomConfig(); public readonly CustomConfig SlashModifier = new CustomConfig(); public readonly CustomConfig PierceModifier = new CustomConfig(); public readonly CustomConfig ChopModifier = new CustomConfig(); public readonly CustomConfig PickaxeModifier = new CustomConfig(); public readonly CustomConfig FireModifier = new CustomConfig(); public readonly CustomConfig FrostModifier = new CustomConfig(); public readonly CustomConfig LightningModifier = new CustomConfig(); public readonly CustomConfig PoisonModifier = new CustomConfig(); public readonly CustomConfig SpiritModifier = new CustomConfig(); } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [Nullable(2)] [UsedImplicitly] public string Category; [Nullable(new byte[] { 2, 1 })] [UsedImplicitly] public Action CustomDrawer; } [Nullable(0)] private class AcceptableEnumValues<[Nullable(0)] T> : AcceptableValueBase where T : struct, IConvertible { [PublicAPI] [Nullable(new byte[] { 1, 0 })] public virtual T[] AcceptableValues { [return: Nullable(new byte[] { 1, 0 })] get; } public AcceptableEnumValues([Nullable(new byte[] { 1, 0 })] params T[] acceptableValues) : base(typeof(T)) { AcceptableValues = acceptableValues; } public override object Clamp(object value) { return ((AcceptableValueBase)this).IsValid(value) ? value : ((object)AcceptableValues[0]); } public override bool IsValid(object value) { return AcceptableValues.Contains((T)value); } public override string ToDescriptionString() { return string.Join(", ", AcceptableValues); } } private readonly HashSet _configuredProperties = new HashSet(); private bool _canSpawn = false; private bool _canBeTamed = false; private string _foodItems = ""; private SpawnTime _specificSpawnTime = SpawnTime.Always; private Range _requiredAltitude = new Range(5f, 1000f); private Range _requiredOceanDepth = new Range(0f, 0f); private GlobalKey _requiredGlobalKey = GlobalKey.None; private Range _groupSize = new Range(1f, 1f); private Biome _biome = (Biome)1; private SpawnArea _specificSpawnArea = SpawnArea.Everywhere; private Weather _requiredWeather = Weather.None; private float _spawnAltitude = 0.5f; private bool _canHaveStars = true; private bool _attackImmediately = false; private int _checkSpawnInterval = 600; private float _spawnChance = 100f; private float _spawnDistance = 10f; private Forest _forestSpawn = Forest.Both; private int _maximum = 1; private float _health = -1f; private float _regenAllHpTime = -1f; private DamageModifier _bluntModifier = (DamageModifier)0; private DamageModifier _slashModifier = (DamageModifier)0; private DamageModifier _pierceModifier = (DamageModifier)0; private DamageModifier _chopModifier = (DamageModifier)0; private DamageModifier _pickaxeModifier = (DamageModifier)0; private DamageModifier _fireModifier = (DamageModifier)0; private DamageModifier _frostModifier = (DamageModifier)0; private DamageModifier _lightningModifier = (DamageModifier)0; private DamageModifier _poisonModifier = (DamageModifier)0; private DamageModifier _spiritModifier = (DamageModifier)0; public bool ConfigurationEnabled = true; public readonly GameObject Prefab; public DropList Drops = new DropList(); private static readonly List registeredCreatures = new List(); private static Dictionary creatureConfigs = new Dictionary(); [Nullable(2)] private static object configManager; private static List lastRegisteredSpawns = new List(); [Nullable(2)] private static Localization _english; [Nullable(2)] private static BaseUnityPlugin _plugin; private static bool hasConfigSync = true; [Nullable(2)] private static object _configSync; public bool CanSpawn => _canSpawn; public bool CanBeTamed => _canBeTamed; public string FoodItems => _foodItems; public SpawnTime SpecificSpawnTime => _specificSpawnTime; public Range RequiredAltitude => _requiredAltitude; public Range RequiredOceanDepth => _requiredOceanDepth; public GlobalKey RequiredGlobalKey => _requiredGlobalKey; public Range GroupSize => _groupSize; public Biome Biome => _biome; public SpawnArea SpecificSpawnArea => _specificSpawnArea; public Weather RequiredWeather => _requiredWeather; public float SpawnAltitude => _spawnAltitude; public bool CanHaveStars => _canHaveStars; public bool AttackImmediately => _attackImmediately; public int CheckSpawnInterval => _checkSpawnInterval; public float SpawnChance => _spawnChance; public float SpawnDistance => _spawnDistance; public Forest ForestSpawn => _forestSpawn; public int Maximum => _maximum; public float Health => _health; public float RegenAllHpTime => _regenAllHpTime; public DamageModifier BluntModifier => _bluntModifier; public DamageModifier SlashModifier => _slashModifier; public DamageModifier PierceModifier => _pierceModifier; public DamageModifier ChopModifier => _chopModifier; public DamageModifier PickaxeModifier => _pickaxeModifier; public DamageModifier FireModifier => _fireModifier; public DamageModifier FrostModifier => _frostModifier; public DamageModifier LightningModifier => _lightningModifier; public DamageModifier PoisonModifier => _poisonModifier; public DamageModifier SpiritModifier => _spiritModifier; private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English")); 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 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([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } [Nullable(2)] private static object configSync { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(2)] get { if (_configSync == null && hasConfigSync) { Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync"); if ((object)type != null) { _configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " CreatureManager"); type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString()); type.GetProperty("IsLocked").SetValue(_configSync, true); } else { hasConfigSync = false; } } return _configSync; } } public bool IsConfigured(string propertyName) { return _configuredProperties.Contains(propertyName); } public Creature EnableSpawning(bool enabled = true, bool isConfigurable = true) { _canSpawn = enabled; if (isConfigurable) { _configuredProperties.Add("CanSpawn"); } return this; } public Creature EnableTaming(bool enabled = true, bool isConfigurable = true) { _canBeTamed = enabled; if (isConfigurable) { _configuredProperties.Add("CanBeTamed"); } return this; } public DropList ConfigureDrops() { _configuredProperties.Add("Drops"); return Drops; } public Creature ConfigureFoodItems(string foodItems, bool isConfigurable = true) { _foodItems = foodItems; if (isConfigurable) { _configuredProperties.Add("FoodItems"); } return this; } public Creature ConfigureSpawnTime(SpawnTime spawnTime, bool isConfigurable = true) { _specificSpawnTime = spawnTime; if (isConfigurable) { _configuredProperties.Add("SpecificSpawnTime"); } return this; } public Creature ConfigureRequiredAltitude(Range altitude, bool isConfigurable = true) { _requiredAltitude = altitude; if (isConfigurable) { _configuredProperties.Add("RequiredAltitude"); } return this; } public Creature ConfigureRequiredOceanDepth(Range depth, bool isConfigurable = true) { _requiredOceanDepth = depth; if (isConfigurable) { _configuredProperties.Add("RequiredOceanDepth"); } return this; } public Creature ConfigureRequiredGlobalKey(GlobalKey globalKey, bool isConfigurable = true) { _requiredGlobalKey = globalKey; if (isConfigurable) { _configuredProperties.Add("RequiredGlobalKey"); } return this; } public Creature ConfigureGroupSize(Range groupSize, bool isConfigurable = true) { _groupSize = groupSize; if (isConfigurable) { _configuredProperties.Add("GroupSize"); } return this; } public Creature ConfigureBiome(Biome biome, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _biome = biome; if (isConfigurable) { _configuredProperties.Add("Biome"); } return this; } public Creature ConfigureSpawnArea(SpawnArea spawnArea, bool isConfigurable = true) { _specificSpawnArea = spawnArea; if (isConfigurable) { _configuredProperties.Add("SpecificSpawnArea"); } return this; } public Creature ConfigureRequiredWeather(Weather weather, bool isConfigurable = true) { _requiredWeather = weather; if (isConfigurable) { _configuredProperties.Add("RequiredWeather"); } return this; } public Creature ConfigureSpawnAltitude(float altitude, bool isConfigurable = true) { _spawnAltitude = altitude; if (isConfigurable) { _configuredProperties.Add("SpawnAltitude"); } return this; } public Creature EnableStars(bool enabled = true, bool isConfigurable = true) { _canHaveStars = enabled; if (isConfigurable) { _configuredProperties.Add("CanHaveStars"); } return this; } public Creature ConfigureAttackImmediately(bool attackImmediately = true, bool isConfigurable = true) { _attackImmediately = attackImmediately; if (isConfigurable) { _configuredProperties.Add("AttackImmediately"); } return this; } public Creature ConfigureSpawnInterval(int interval, bool isConfigurable = true) { _checkSpawnInterval = interval; if (isConfigurable) { _configuredProperties.Add("CheckSpawnInterval"); } return this; } public Creature ConfigureSpawnChance(float chance, bool isConfigurable = true) { _spawnChance = chance; if (isConfigurable) { _configuredProperties.Add("SpawnChance"); } return this; } public Creature ConfigureSpawnDistance(float distance, bool isConfigurable = true) { _spawnDistance = distance; if (isConfigurable) { _configuredProperties.Add("SpawnDistance"); } return this; } public Creature ConfigureForestSpawn(Forest forest, bool isConfigurable = true) { _forestSpawn = forest; if (isConfigurable) { _configuredProperties.Add("ForestSpawn"); } return this; } public Creature ConfigureMaximum(int max, bool isConfigurable = true) { _maximum = max; if (isConfigurable) { _configuredProperties.Add("Maximum"); } return this; } public Creature ConfigureHealth(float health, bool isConfigurable = true) { _health = health; if (isConfigurable) { _configuredProperties.Add("Health"); } return this; } public Creature ConfigureRegenAllHpTime(float time, bool isConfigurable = true) { _regenAllHpTime = time; if (isConfigurable) { _configuredProperties.Add("RegenAllHpTime"); } return this; } public Creature ConfigureBluntModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _bluntModifier = modifier; if (isConfigurable) { _configuredProperties.Add("BluntModifier"); } return this; } public Creature ConfigureSlashModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _slashModifier = modifier; if (isConfigurable) { _configuredProperties.Add("SlashModifier"); } return this; } public Creature ConfigurePierceModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _pierceModifier = modifier; if (isConfigurable) { _configuredProperties.Add("PierceModifier"); } return this; } public Creature ConfigureChopModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _chopModifier = modifier; if (isConfigurable) { _configuredProperties.Add("ChopModifier"); } return this; } public Creature ConfigurePickaxeModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _pickaxeModifier = modifier; if (isConfigurable) { _configuredProperties.Add("PickaxeModifier"); } return this; } public Creature ConfigureFireModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _fireModifier = modifier; if (isConfigurable) { _configuredProperties.Add("FireModifier"); } return this; } public Creature ConfigureFrostModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _frostModifier = modifier; if (isConfigurable) { _configuredProperties.Add("FrostModifier"); } return this; } public Creature ConfigureLightningModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _lightningModifier = modifier; if (isConfigurable) { _configuredProperties.Add("LightningModifier"); } return this; } public Creature ConfigurePoisonModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _poisonModifier = modifier; if (isConfigurable) { _configuredProperties.Add("PoisonModifier"); } return this; } public Creature ConfigureSpiritModifier(DamageModifier modifier, bool isConfigurable = true) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _spiritModifier = modifier; if (isConfigurable) { _configuredProperties.Add("SpiritModifier"); } return this; } internal static bool IsRegisteredCreature(string prefabName) { return registeredCreatures.Any([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Creature c) => ((Object)c.Prefab).name == prefabName); } public Creature(string assetBundleFileName, string prefabName, string folderName = "assets") : this(PrefabManager.RegisterAssetBundle(assetBundleFileName, folderName), prefabName) { } public Creature(AssetBundle bundle, string prefabName) : this(PrefabManager.RegisterPrefab(bundle, prefabName)) { } public Creature(GameObject creature) { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: 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_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) Prefab = creature; registeredCreatures.Add(this); } public LocalizeKey Localize() { return new LocalizeKey(Prefab.GetComponent().m_name); } internal static void Patch_FejdStartup() { //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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown //IL_076d: Unknown result type (might be due to invalid IL or missing references) //IL_0777: Expected O, but got Unknown //IL_0da8: Unknown result type (might be due to invalid IL or missing references) //IL_0db2: Expected O, but got Unknown Type type = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Assembly a) => a.GetName().Name == "ConfigurationManager")?.GetType("ConfigurationManager.ConfigurationManager"); configManager = ((type == null) ? null : Chainloader.ManagerObject.GetComponent(type)); if (!TomlTypeConverter.CanConvert(typeof(Range))) { TomlTypeConverter.AddConverter(typeof(Range), new TypeConverter { ConvertToObject = [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (string s, Type _) => { Match match = Regex.Match(s, "^(-?\\d+(?:\\.\\d*)?)\\s*-\\s*(-?\\d+(?:\\.\\d*)?)$"); return match.Success ? new Range(float.Parse(match.Groups[1].Value), float.Parse(match.Groups[2].Value)) : default(Range); }, ConvertToString = [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object obj, Type _) => { Range range = (Range)obj; return $"{range.min} - {range.max}"; } }); } bool saveOnConfigSet = plugin.Config.SaveOnConfigSet; plugin.Config.SaveOnConfigSet = false; foreach (Creature registeredCreature in registeredCreatures) { Creature creature = registeredCreature; CreatureConfig creatureConfig2 = (creatureConfigs[creature] = new CreatureConfig()); CreatureConfig cfg = creatureConfig2; string name2 = creature.Prefab.GetComponent().m_name; string englishName = new Regex("['[\"\\]]").Replace(english.Localize(name2), "").Trim(); string localizedName = englishName; if (Localization.m_instance != null) { localizedName = Localization.instance.Localize(name2).Trim(); } int order = 0; cfg.Spawn.get = () => creature.CanSpawn ? SpawnOption.Default : SpawnOption.Disabled; cfg.CanBeTamed.get = () => (!creature.CanBeTamed) ? Toggle.Off : Toggle.On; cfg.ConsumesItemName.get = () => creature.FoodItems; cfg.SpecificSpawnTime.get = () => creature.SpecificSpawnTime; cfg.RequiredAltitude.get = () => creature.RequiredAltitude; cfg.RequiredOceanDepth.get = () => creature.RequiredOceanDepth; cfg.RequiredGlobalKey.get = () => creature.RequiredGlobalKey; cfg.GroupSize.get = () => creature.GroupSize; cfg.Biome.get = () => creature.Biome; cfg.SpecificSpawnArea.get = () => creature.SpecificSpawnArea; cfg.RequiredWeather.get = () => creature.RequiredWeather; cfg.SpawnAltitude.get = () => creature.SpawnAltitude; cfg.CanHaveStars.get = () => (!creature.CanHaveStars) ? Toggle.Off : Toggle.On; cfg.AttackImmediately.get = () => (!creature.AttackImmediately) ? Toggle.Off : Toggle.On; cfg.CheckSpawnInterval.get = () => creature.CheckSpawnInterval; cfg.SpawnChance.get = () => creature.SpawnChance; cfg.SpawnDistance.get = () => creature.SpawnDistance; cfg.ForestSpawn.get = () => creature.ForestSpawn; cfg.Maximum.get = () => creature.Maximum; cfg.Drops.get = () => DropOption.Default; cfg.CustomDrops.get = () => new DropList.SerializedDrops(creature.Drops, creature).ToString(); cfg.Health.get = () => creature.Prefab.GetComponent()?.m_health ?? creature.Health; cfg.RegenAllHpTime.get = delegate { Character component = creature.Prefab.GetComponent(); if ((Object)(object)component == (Object)null) { return creature.RegenAllHpTime; } FieldInfo fieldInfo = typeof(Character).GetField("m_regenAllHPTime", BindingFlags.Instance | BindingFlags.Public) ?? typeof(Character).GetField("m_regenAllHpTime", BindingFlags.Instance | BindingFlags.Public); return (fieldInfo != null) ? ((float)fieldInfo.GetValue(component)) : creature.RegenAllHpTime; }; cfg.BluntModifier.get = () => creature.BluntModifier; cfg.SlashModifier.get = () => creature.SlashModifier; cfg.PierceModifier.get = () => creature.PierceModifier; cfg.ChopModifier.get = () => creature.ChopModifier; cfg.PickaxeModifier.get = () => creature.PickaxeModifier; cfg.FireModifier.get = () => creature.FireModifier; cfg.FrostModifier.get = () => creature.FrostModifier; cfg.LightningModifier.get = () => creature.LightningModifier; cfg.PoisonModifier.get = () => creature.PoisonModifier; cfg.SpiritModifier.get = () => creature.SpiritModifier; ConfigurationManagerAttributes tameConfigVisibility = new ConfigurationManagerAttributes(); if (creature.IsConfigured("CanBeTamed")) { config(cfg.CanBeTamed, cfg.CanBeTamed.get, delegate { tameConfigVisibility.Browsable = cfg.CanBeTamed.get() == Toggle.On; reloadConfigDisplay(); updateAI(); }, "Can be tamed", "Decides, if the creature can be tamed."); } tameConfigVisibility.Browsable = cfg.CanBeTamed.get() == Toggle.On; if (creature.IsConfigured("FoodItems")) { configWithDesc(cfg.ConsumesItemName, cfg.ConsumesItemName.get, updateAI, "Food items", new ConfigDescription("The items the creature consumes to get tame.", (AcceptableValueBase)null, new object[1] { tameConfigVisibility })); } ConfigurationManagerAttributes spawnConfigVisibility = new ConfigurationManagerAttributes(); ConfigurationManagerAttributes dropConfigVisibility = new ConfigurationManagerAttributes(); if (creature.IsConfigured("CanSpawn")) { config(cfg.Spawn, cfg.Spawn.get, delegate { spawnConfigVisibility.Browsable = cfg.Spawn.get() == SpawnOption.Custom; reloadConfigDisplay(); updateAllSpawnConfigs(); }, "Spawn", "Configures the spawn for the creature."); } spawnConfigVisibility.Browsable = cfg.Spawn.get() == SpawnOption.Custom; if (creature.IsConfigured("SpecificSpawnTime")) { spawnConfig(cfg.SpecificSpawnTime, cfg.SpecificSpawnTime.get, "Spawn time", "Configures the time of day for the creature to spawn."); } if (creature.IsConfigured("RequiredAltitude")) { spawnConfig(cfg.RequiredAltitude, cfg.RequiredAltitude.get, "Required altitude", "Configures the altitude required for the creature to spawn."); } if (creature.IsConfigured("RequiredOceanDepth")) { spawnConfig(cfg.RequiredOceanDepth, cfg.RequiredOceanDepth.get, "Required ocean depth", "Configures the ocean depth required for the creature to spawn."); } if (creature.IsConfigured("RequiredGlobalKey")) { spawnConfig(cfg.RequiredGlobalKey, cfg.RequiredGlobalKey.get, "Required global key", "Configures the global key required for the creature to spawn."); } if (creature.IsConfigured("GroupSize")) { spawnConfig(cfg.GroupSize, cfg.GroupSize.get, "Group size", "Configures the size of the groups in which the creature spawns."); } if (creature.IsConfigured("Biome")) { spawnConfig(cfg.Biome, cfg.Biome.get, "Biome", "Configures the biome required for the creature to spawn."); } if (creature.IsConfigured("SpecificSpawnArea")) { spawnConfig(cfg.SpecificSpawnArea, cfg.SpecificSpawnArea.get, "Spawn area", "Configures if the creature spawns more towards the center or the edge of the biome."); } if (creature.IsConfigured("RequiredWeather")) { spawnConfig(cfg.RequiredWeather, cfg.RequiredWeather.get, "Required weather", "Configures the weather required for the creature to spawn."); } if (creature.IsConfigured("SpawnAltitude")) { spawnConfig(cfg.SpawnAltitude, cfg.SpawnAltitude.get, "Spawn altitude", "Configures the height from the ground in which the creature will spawn."); } if (creature.IsConfigured("CanHaveStars")) { spawnConfig(cfg.CanHaveStars, cfg.CanHaveStars.get, "Can have stars", "If the creature can have stars."); } if (creature.IsConfigured("AttackImmediately")) { spawnConfig(cfg.AttackImmediately, cfg.AttackImmediately.get, "Hunt player", "Makes the creature immediately hunt down the player after it spawns."); } if (creature.IsConfigured("CheckSpawnInterval")) { spawnConfig(cfg.CheckSpawnInterval, cfg.CheckSpawnInterval.get, "Maximum spawn interval", "Configures the timespan that Valheim has to make the creature spawn."); } if (creature.IsConfigured("SpawnChance")) { spawnConfig(cfg.SpawnChance, cfg.SpawnChance.get, "Spawn chance", "Sets the chance for the creature to be spawned, every time Valheim checks the spawn."); } if (creature.IsConfigured("SpawnDistance")) { spawnConfig(cfg.SpawnDistance, cfg.SpawnDistance.get, "Spawn distance", "Minimum distance in meters to another instance of the same creature before Valheim allows a new spawn."); } if (creature.IsConfigured("ForestSpawn")) { spawnConfig(cfg.ForestSpawn, cfg.ForestSpawn.get, "Forest condition", "If the creature can spawn in forests or cannot spawn in forests. Or both."); } if (creature.IsConfigured("Maximum")) { spawnConfig(cfg.Maximum, cfg.Maximum.get, "Maximum creature count", "The maximum number of this creature near the player, before Valheim stops spawning it in. Setting this lower than the upper limit of the group size does not make sense."); } if (creature.IsConfigured("Drops")) { config(cfg.Drops, cfg.Drops.get, delegate { dropConfigVisibility.Browsable = cfg.Drops.get() == DropOption.Custom; reloadConfigDisplay(); DropList.UpdateDrops(creature); }, "Drops", "Configures the drops for the creature."); dropConfigVisibility.Browsable = cfg.Drops.get() == DropOption.Custom; configWithDesc(cfg.CustomDrops, cfg.CustomDrops.get, delegate { DropList.UpdateDrops(creature); }, "Drop config", new ConfigDescription("", (AcceptableValueBase)null, new object[1] { dropConfigVisibility })); } if (creature.IsConfigured("Health")) { config(cfg.Health, cfg.Health.get, updateCharacterStats, "Health", "Maximum health points of the creature."); } if (creature.IsConfigured("RegenAllHpTime")) { config(cfg.RegenAllHpTime, cfg.RegenAllHpTime.get, updateCharacterStats, "Regen All HP Time", "Time in seconds to fully regenerate HP (0 = disabled)."); } if (creature.IsConfigured("BluntModifier")) { config(cfg.BluntModifier, cfg.BluntModifier.get, updateCharacterStats, "Damage Modifier: Blunt", "Resistance to blunt damage."); } if (creature.IsConfigured("SlashModifier")) { config(cfg.SlashModifier, cfg.SlashModifier.get, updateCharacterStats, "Damage Modifier: Slash", "Resistance to slash damage."); } if (creature.IsConfigured("PierceModifier")) { config(cfg.PierceModifier, cfg.PierceModifier.get, updateCharacterStats, "Damage Modifier: Pierce", "Resistance to pierce damage."); } if (creature.IsConfigured("ChopModifier")) { config(cfg.ChopModifier, cfg.ChopModifier.get, updateCharacterStats, "Damage Modifier: Chop", "Resistance to chop damage."); } if (creature.IsConfigured("PickaxeModifier")) { config(cfg.PickaxeModifier, cfg.PickaxeModifier.get, updateCharacterStats, "Damage Modifier: Pickaxe", "Resistance to pickaxe damage."); } if (creature.IsConfigured("FireModifier")) { config(cfg.FireModifier, cfg.FireModifier.get, updateCharacterStats, "Damage Modifier: Fire", "Resistance to fire damage."); } if (creature.IsConfigured("FrostModifier")) { config(cfg.FrostModifier, cfg.FrostModifier.get, updateCharacterStats, "Damage Modifier: Frost", "Resistance to frost damage."); } if (creature.IsConfigured("LightningModifier")) { config(cfg.LightningModifier, cfg.LightningModifier.get, updateCharacterStats, "Damage Modifier: Lightning", "Resistance to lightning damage."); } if (creature.IsConfigured("PoisonModifier")) { config(cfg.PoisonModifier, cfg.PoisonModifier.get, updateCharacterStats, "Damage Modifier: Poison", "Resistance to poison damage."); } if (creature.IsConfigured("SpiritModifier")) { config(cfg.SpiritModifier, cfg.SpiritModifier.get, updateCharacterStats, "Damage Modifier: Spirit", "Resistance to spirit damage."); } void config([Nullable(new byte[] { 1, 0 })] CustomConfig customConfig, [Nullable(new byte[] { 1, 0 })] Func getter, Action configChanged, string name, string desc) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown configWithDesc(customConfig, getter, configChanged, name, new ConfigDescription(desc, (AcceptableValueBase)null, Array.Empty())); } void configWithDesc([Nullable(new byte[] { 1, 0 })] CustomConfig customConfig, [Nullable(new byte[] { 1, 0 })] Func getter, Action configChanged, string name, ConfigDescription desc) { //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown if (creature.ConfigurationEnabled) { customConfig.config = pluginConfig(englishName, name, getter(), new ConfigDescription(desc.Description, desc.AcceptableValues, desc.Tags.Concat(new ConfigurationManagerAttributes[1] { new ConfigurationManagerAttributes { Order = (order -= 1), CustomDrawer = ((customConfig == cfg.CustomDrops) ? new Action(drawConfigTable) : ((typeof(T) == typeof(Range)) ? new Action(drawRange) : null)), Category = localizedName } }).ToArray())); customConfig.config.SettingChanged += [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object _, EventArgs _) => { configChanged(); }; customConfig.get = [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] () => customConfig.config.Value; } } void spawnConfig([Nullable(new byte[] { 1, 0 })] CustomConfig customConfig, [Nullable(new byte[] { 1, 0 })] Func getter, string name, string desc, [Nullable(2)] AcceptableValueBase acceptableValues = null) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown configWithDesc(customConfig, getter, updateAllSpawnConfigs, name, new ConfigDescription(desc, acceptableValues, new object[1] { spawnConfigVisibility })); } void updateAI() { if (Object.op_Implicit((Object)(object)ObjectDB.instance)) { BaseAI[] array3 = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (BaseAI ai in array3) { creature.updateAi(ai); } creature.updateAi(creature.Prefab.GetComponent()); } } void updateAllSpawnConfigs() { SpawnSystem[] array2 = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (SpawnSystem val2 in array2) { foreach (SpawnSystemList spawnList in val2.m_spawnLists) { foreach (SpawnData spawner in spawnList.m_spawners) { if ((Object)(object)creature.Prefab == (Object)(object)spawner.m_prefab) { creature.updateSpawnData(spawner); } } } } } void updateCharacterStats() { creature.applyCharacterStats(creature.Prefab.GetComponent()); Character[] array = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (Character val in array) { if (((Object)((Component)val).gameObject).name.StartsWith(((Object)creature.Prefab).name)) { creature.applyCharacterStats(val); } } } } if (saveOnConfigSet) { plugin.Config.SaveOnConfigSet = true; plugin.Config.Save(); } static void reloadConfigDisplay() { object obj2 = configManager?.GetType().GetProperty("DisplayingWindow").GetValue(configManager); if (obj2 is bool && (bool)obj2) { configManager.GetType().GetMethod("BuildSettingList").Invoke(configManager, Array.Empty()); } } } private static void drawRange(ConfigEntryBase cfg) { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown bool valueOrDefault = cfg.Description.Tags.Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object a) => (a.GetType().Name == "ConfigurationManagerAttributes") ? ((bool?)a.GetType().GetField("ReadOnly")?.GetValue(a)) : null).FirstOrDefault((bool? v) => v.HasValue).GetValueOrDefault(); ConfigEntry val = (ConfigEntry)(object)cfg; GUILayout.BeginHorizontal(Array.Empty()); float.TryParse(GUILayout.TextField(val.Value.min.ToString(CultureInfo.InvariantCulture), Array.Empty()), out var result); GUILayout.Label(" - ", new GUIStyle(GUI.skin.label) { fixedWidth = 14f }, Array.Empty()); float.TryParse(GUILayout.TextField(val.Value.max.ToString(CultureInfo.InvariantCulture), Array.Empty()), out var result2); GUILayout.EndHorizontal(); if (!valueOrDefault && (Math.Abs(val.Value.min - result) > 1E-05f || Math.Abs(val.Value.max - result2) > 1E-05f)) { val.Value = new Range(result, result2); } } private static void drawConfigTable(ConfigEntryBase cfg) { //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Expected O, but got Unknown //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Expected O, but got Unknown //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Expected O, but got Unknown //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Expected O, but got Unknown //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Expected O, but got Unknown //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: Expected O, but got Unknown //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Expected O, but got Unknown //IL_0366: Unknown result type (might be due to invalid IL or missing references) //IL_0375: Expected O, but got Unknown //IL_03b7: Unknown result type (might be due to invalid IL or missing references) //IL_03c6: Expected O, but got Unknown //IL_03f6: Unknown result type (might be due to invalid IL or missing references) //IL_03fb: Unknown result type (might be due to invalid IL or missing references) //IL_03fd: Unknown result type (might be due to invalid IL or missing references) //IL_0404: Unknown result type (might be due to invalid IL or missing references) //IL_0415: Unknown result type (might be due to invalid IL or missing references) //IL_0485: Unknown result type (might be due to invalid IL or missing references) //IL_048a: Unknown result type (might be due to invalid IL or missing references) //IL_04a0: Expected O, but got Unknown bool valueOrDefault = cfg.Description.Tags.Select([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (object a) => (a.GetType().Name == "ConfigurationManagerAttributes") ? ((bool?)a.GetType().GetField("ReadOnly")?.GetValue(a)) : null).FirstOrDefault((bool? v) => v.HasValue).GetValueOrDefault(); List> list = new List>(); bool flag = false; int num = (int)(configManager?.GetType().GetProperty("RightColumnWidth", BindingFlags.Instance | BindingFlags.NonPublic).GetGetMethod(nonPublic: true) .Invoke(configManager, Array.Empty()) ?? ((object)130)); GUILayout.BeginVertical(Array.Empty()); foreach (KeyValuePair drop in new DropList.SerializedDrops((string)cfg.BoxedValue).Drops) { GUILayout.BeginHorizontal(Array.Empty()); int num2 = Mathf.RoundToInt(drop.Value.Amount.min); if (int.TryParse(GUILayout.TextField(num2.ToString(), new GUIStyle(GUI.skin.textField) { fixedWidth = 35f }, Array.Empty()), out var result) && result != num2 && !valueOrDefault) { num2 = result; flag = true; } GUILayout.Label(" - ", new GUIStyle(GUI.skin.label) { fixedWidth = 14f }, Array.Empty()); int num3 = Mathf.RoundToInt(drop.Value.Amount.max); if (int.TryParse(GUILayout.TextField(num3.ToString(), new GUIStyle(GUI.skin.textField) { fixedWidth = 35f }, Array.Empty()), out var result2) && result2 != num3 && !valueOrDefault) { num3 = result2; flag = true; } GUILayout.Label(" ", new GUIStyle(GUI.skin.label) { fixedWidth = 10f }, Array.Empty()); string text = GUILayout.TextField(drop.Key, new GUIStyle(GUI.skin.textField) { fixedWidth = num - 35 - 14 - 35 - 10 - 21 - 18 }, Array.Empty()); string text2 = (valueOrDefault ? drop.Key : text); flag = flag || text2 != drop.Key; bool flag2 = GUILayout.Button("x", new GUIStyle(GUI.skin.button) { fixedWidth = 21f }, Array.Empty()) && !valueOrDefault; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty()); float num4 = drop.Value.DropChance; if (float.TryParse(GUILayout.TextField(num4.ToString(CultureInfo.InvariantCulture), new GUIStyle(GUI.skin.textField) { fixedWidth = 45f }, Array.Empty()), out var result3) && Math.Abs(result3 - num4) > 1E-05f && !valueOrDefault) { num4 = result3; flag = true; } GUILayout.Label("% ", Array.Empty()); string tooltip = GUI.tooltip; bool flag3 = drop.Value.MultiplyDropByLevel; bool flag4 = GUILayout.Toggle(flag3, new GUIContent(flag3 ? "per level" : "fixed", "Loot is multiplied by the creature's level."), Array.Empty()); if (flag4 != flag3 && !valueOrDefault) { flag3 = flag4; flag = true; } bool flag5 = drop.Value.DropOnePerPlayer; bool flag6 = GUILayout.Toggle(flag5, new GUIContent(flag5 ? "per player" : "independent", "Drops one per player."), Array.Empty()); if (flag6 != flag5 && !valueOrDefault) { flag5 = flag6; flag = true; } if (GUI.tooltip != tooltip) { Vector3 mousePosition = Input.mousePosition; GUI.Label(new Rect(mousePosition.x, mousePosition.y, 100f, 35f), GUI.tooltip); } if (flag2) { flag = true; } else { Drop value = new Drop { Amount = new Range(num2, num3), DropChance = num4, MultiplyDropByLevel = flag3, DropOnePerPlayer = flag5 }; list.Add(new KeyValuePair(text2, value)); } if (GUILayout.Button("+", new GUIStyle(GUI.skin.button) { fixedWidth = 21f }, Array.Empty()) && !valueOrDefault) { flag = true; list.Add(new KeyValuePair("", new Drop())); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); if (flag) { cfg.BoxedValue = new DropList.SerializedDrops(list).ToString(); } } private void updateAi(BaseAI ai) { CreatureConfig creatureConfig = creatureConfigs[this]; if (Object.op_Implicit((Object)(object)((Component)ai).GetComponent()) != (creatureConfig.CanBeTamed.get() == Toggle.On)) { if (creatureConfig.CanBeTamed.get() == Toggle.On) { ai.m_tamable = ((Component)ai).gameObject.AddComponent(); } else { Object.Destroy((Object)(object)ai.m_tamable); ai.m_tamable = null; } } MonsterAI val = (MonsterAI)(object)((ai is MonsterAI) ? ai : null); if (val == null) { return; } val.m_consumeItems.Clear(); string[] array = creatureConfig.ConsumesItemName.get().Split(new char[1] { ',' }); string[] array2 = array; foreach (string text in array2) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(text.Trim()); ItemDrop val2 = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if (val2 != null) { val.m_consumeItems.Add(val2); } } } internal static void UpdateCreatures(ObjectDB __instance) { BaseAI ai = default(BaseAI); Character character = default(Character); foreach (Creature registeredCreature in registeredCreatures) { if (registeredCreature.Prefab.TryGetComponent(ref ai)) { registeredCreature.updateAi(ai); } if (registeredCreature.Prefab.TryGetComponent(ref character)) { registeredCreature.applyCharacterStats(character); } } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(2)] private void applyCharacterStats(Character character) { //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_025c: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)character == (Object)null)) { CreatureConfig creatureConfig = creatureConfigs[this]; if (IsConfigured("Health")) { character.m_health = creatureConfig.Health.get(); } if (IsConfigured("RegenAllHpTime")) { (typeof(Character).GetField("m_regenAllHPTime", BindingFlags.Instance | BindingFlags.Public) ?? typeof(Character).GetField("m_regenAllHpTime", BindingFlags.Instance | BindingFlags.Public))?.SetValue(character, creatureConfig.RegenAllHpTime.get()); } if (IsConfigured("BluntModifier")) { character.m_damageModifiers.m_blunt = creatureConfig.BluntModifier.get(); } if (IsConfigured("SlashModifier")) { character.m_damageModifiers.m_slash = creatureConfig.SlashModifier.get(); } if (IsConfigured("PierceModifier")) { character.m_damageModifiers.m_pierce = creatureConfig.PierceModifier.get(); } if (IsConfigured("ChopModifier")) { character.m_damageModifiers.m_chop = creatureConfig.ChopModifier.get(); } if (IsConfigured("PickaxeModifier")) { character.m_damageModifiers.m_pickaxe = creatureConfig.PickaxeModifier.get(); } if (IsConfigured("FireModifier")) { character.m_damageModifiers.m_fire = creatureConfig.FireModifier.get(); } if (IsConfigured("FrostModifier")) { character.m_damageModifiers.m_frost = creatureConfig.FrostModifier.get(); } if (IsConfigured("LightningModifier")) { character.m_damageModifiers.m_lightning = creatureConfig.LightningModifier.get(); } if (IsConfigured("PoisonModifier")) { character.m_damageModifiers.m_poison = creatureConfig.PoisonModifier.get(); } if (IsConfigured("SpiritModifier")) { character.m_damageModifiers.m_spirit = creatureConfig.SpiritModifier.get(); } } } internal static void ApplyCreatureStats(ZNetScene __instance) { foreach (Creature registeredCreature in registeredCreatures) { registeredCreature.applyCharacterStats(registeredCreature.Prefab.GetComponent()); } } private void updateSpawnData(SpawnData spawnData) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0089: 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_007d: 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) CreatureConfig cfg = creatureConfigs[this]; spawnData.m_enabled = cfg.Spawn.get() != SpawnOption.Disabled; spawnData.m_biome = cfg.Biome.get(); SpawnArea spawnArea = cfg.SpecificSpawnArea.get(); if (1 == 0) { } BiomeArea biomeArea = (BiomeArea)(spawnArea switch { SpawnArea.Center => 2, SpawnArea.Edge => 1, _ => 3, }); if (1 == 0) { } spawnData.m_biomeArea = biomeArea; spawnData.m_maxSpawned = cfg.Maximum.get(); spawnData.m_spawnInterval = cfg.CheckSpawnInterval.get(); spawnData.m_spawnChance = cfg.SpawnChance.get(); spawnData.m_spawnDistance = cfg.SpawnDistance.get(); spawnData.m_requiredGlobalKey = ((InternalName)typeof(GlobalKey).GetMember(cfg.RequiredGlobalKey.get().ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName; spawnData.m_requiredEnvironments = (from Weather w in Enum.GetValues(typeof(Weather)) where (w & cfg.RequiredWeather.get()) != 0 select ((InternalName)typeof(Weather).GetMember(w.ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).ToList(); spawnData.m_groupSizeMin = (int)cfg.GroupSize.get().min; spawnData.m_groupSizeMax = (int)cfg.GroupSize.get().max; SpawnTime spawnTime = cfg.SpecificSpawnTime.get(); bool spawnAtNight = (uint)(spawnTime - 1) <= 1u; spawnData.m_spawnAtNight = spawnAtNight; spawnTime = cfg.SpecificSpawnTime.get(); spawnAtNight = ((spawnTime == SpawnTime.Day || spawnTime == SpawnTime.Always) ? true : false); spawnData.m_spawnAtDay = spawnAtNight; spawnData.m_minAltitude = cfg.RequiredAltitude.get().min; spawnData.m_maxAltitude = cfg.RequiredAltitude.get().max; Forest forest = cfg.ForestSpawn.get(); spawnAtNight = ((forest == Forest.Yes || forest == Forest.Both) ? true : false); spawnData.m_inForest = spawnAtNight; forest = cfg.ForestSpawn.get(); spawnAtNight = (uint)(forest - 1) <= 1u; spawnData.m_outsideForest = spawnAtNight; spawnData.m_minOceanDepth = cfg.RequiredOceanDepth.get().min; spawnData.m_maxOceanDepth = cfg.RequiredOceanDepth.get().max; spawnData.m_huntPlayer = cfg.AttackImmediately.get() == Toggle.On; spawnData.m_groundOffset = cfg.SpawnAltitude.get(); spawnData.m_maxLevel = ((cfg.CanHaveStars.get() != 0) ? 1 : 3); } [HarmonyPriority(700)] internal static void AddToSpawnSystem(SpawnSystem __instance) { //IL_006f: 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_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown SpawnSystemList val = __instance.m_spawnLists.First(); foreach (SpawnData lastRegisteredSpawn in lastRegisteredSpawns) { val.m_spawners.Remove(lastRegisteredSpawn); } lastRegisteredSpawns.Clear(); foreach (Creature registeredCreature in registeredCreatures) { SpawnData val2 = new SpawnData { m_name = ((Object)registeredCreature.Prefab).name, m_prefab = registeredCreature.Prefab }; registeredCreature.updateSpawnData(val2); lastRegisteredSpawns.Add(val2); val.m_spawners.Add(val2); } } private static ConfigEntry pluginConfig<[Nullable(2)] T>(string group, string name, T value, ConfigDescription description) { ConfigEntry val = plugin.Config.Bind(group, name, value, description); configSync?.GetType().GetMethod("AddConfigEntry").MakeGenericMethod(typeof(T)) .Invoke(configSync, new object[1] { val }); return val; } private static ConfigEntry pluginConfig<[Nullable(2)] T>(string group, string name, T value, string description) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown return pluginConfig(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty())); } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] [PublicAPI] public class LocalizeKey { private static readonly List keys = new List(); public readonly string Key; public readonly Dictionary Localizations = new Dictionary(); public LocalizeKey(string key) { Key = key.Replace("$", ""); keys.Add(this); } public void Alias(string alias) { Localizations.Clear(); if (!alias.Contains("$")) { alias = "$" + alias; } Localizations["alias"] = alias; if (Localization.m_instance != null) { Localization.instance.AddWord(Key, Localization.instance.Localize(alias)); } } public LocalizeKey English(string key) { return addForLang("English", key); } public LocalizeKey Swedish(string key) { return addForLang("Swedish", key); } public LocalizeKey French(string key) { return addForLang("French", key); } public LocalizeKey Italian(string key) { return addForLang("Italian", key); } public LocalizeKey German(string key) { return addForLang("German", key); } public LocalizeKey Spanish(string key) { return addForLang("Spanish", key); } public LocalizeKey Russian(string key) { return addForLang("Russian", key); } public LocalizeKey Romanian(string key) { return addForLang("Romanian", key); } public LocalizeKey Bulgarian(string key) { return addForLang("Bulgarian", key); } public LocalizeKey Macedonian(string key) { return addForLang("Macedonian", key); } public LocalizeKey Finnish(string key) { return addForLang("Finnish", key); } public LocalizeKey Danish(string key) { return addForLang("Danish", key); } public LocalizeKey Norwegian(string key) { return addForLang("Norwegian", key); } public LocalizeKey Icelandic(string key) { return addForLang("Icelandic", key); } public LocalizeKey Turkish(string key) { return addForLang("Turkish", key); } public LocalizeKey Lithuanian(string key) { return addForLang("Lithuanian", key); } public LocalizeKey Czech(string key) { return addForLang("Czech", key); } public LocalizeKey Hungarian(string key) { return addForLang("Hungarian", key); } public LocalizeKey Slovak(string key) { return addForLang("Slovak", key); } public LocalizeKey Polish(string key) { return addForLang("Polish", key); } public LocalizeKey Dutch(string key) { return addForLang("Dutch", key); } public LocalizeKey Portuguese_European(string key) { return addForLang("Portuguese_European", key); } public LocalizeKey Portuguese_Brazilian(string key) { return addForLang("Portuguese_Brazilian", key); } public LocalizeKey Chinese(string key) { return addForLang("Chinese", key); } public LocalizeKey Japanese(string key) { return addForLang("Japanese", key); } public LocalizeKey Korean(string key) { return addForLang("Korean", key); } public LocalizeKey Hindi(string key) { return addForLang("Hindi", key); } public LocalizeKey Thai(string key) { return addForLang("Thai", key); } public LocalizeKey Abenaki(string key) { return addForLang("Abenaki", key); } public LocalizeKey Croatian(string key) { return addForLang("Croatian", key); } public LocalizeKey Georgian(string key) { return addForLang("Georgian", key); } public LocalizeKey Greek(string key) { return addForLang("Greek", key); } public LocalizeKey Serbian(string key) { return addForLang("Serbian", key); } public LocalizeKey Ukrainian(string key) { return addForLang("Ukrainian", key); } private LocalizeKey addForLang(string lang, string value) { Localizations[lang] = value; if (Localization.m_instance != null) { if (Localization.instance.GetSelectedLanguage() == lang) { Localization.instance.AddWord(Key, value); } else if (lang == "English" && !Localization.instance.m_translations.ContainsKey(Key)) { Localization.instance.AddWord(Key, value); } } return this; } [HarmonyPriority(300)] internal static void AddLocalizedKeys(Localization __instance, string language) { foreach (LocalizeKey key in keys) { string value2; if (key.Localizations.TryGetValue(language, out var value) || key.Localizations.TryGetValue("English", out value)) { __instance.AddWord(key.Key, value); } else if (key.Localizations.TryGetValue("alias", out value2)) { __instance.AddWord(key.Key, __instance.Localize(value2)); } } } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public static class LocalizationCache { private static readonly Dictionary localizations = new Dictionary(); internal static void LocalizationPostfix(Localization __instance, string language) { string key = localizations.FirstOrDefault([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (KeyValuePair l) => l.Value == __instance).Key; if (key != null) { localizations.Remove(key); } if (!localizations.ContainsKey(language)) { localizations.Add(language, __instance); } } public static Localization ForLanguage([Nullable(2)] string language = null) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (localizations.TryGetValue(language ?? PlayerPrefs.GetString("language", "English"), out var value)) { return value; } value = new Localization(); if (language != null) { value.SetupLanguage(language); } return value; } } [Nullable(0)] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] public static class PrefabManager { [Nullable(0)] private struct BundleId { [UsedImplicitly] public string assetBundleFileName; [UsedImplicitly] public string folderName; } private static readonly Dictionary bundleCache; private static readonly List prefabs; static PrefabManager() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Expected O, but got Unknown //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Expected O, but got Unknown //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Expected O, but got Unknown //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Expected O, but got Unknown //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_0286: Expected O, but got Unknown bundleCache = new Dictionary(); prefabs = new List(); Harmony val = new Harmony("org.bepinex.helpers.CreatureManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PrefabManager), "Patch_ZNetSceneAwake", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Creature), "ApplyCreatureStats", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Creature.DropList), "AddDropsToCreature", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(SpawnSystem), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Creature), "AddToSpawnSystem", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ObjectDB), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Creature), "UpdateCreatures", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Creature), "Patch_FejdStartup", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizeKey), "AddLocalizedKeys", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "SetupLanguage", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizationCache), "LocalizationPostfix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); if (!typeof(Biome).GetCustomAttributes(typeof(FlagsAttribute), inherit: false).Any()) { val.Patch((MethodBase)AccessTools.Method(typeof(Biome).GetType(), "GetCustomAttributes", new Type[2] { typeof(Type), typeof(bool) }, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PrefabManager), "BiomeIsFlags", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } private static void BiomeIsFlags(Type __instance, Type attributeType, ref object[] __result) { if (__instance == typeof(Biome) && attributeType == typeof(FlagsAttribute)) { __result = new object[1] { new FlagsAttribute() }; } } public static AssetBundle RegisterAssetBundle(string assetBundleFileName, string folderName = "assets") { BundleId bundleId = default(BundleId); bundleId.assetBundleFileName = assetBundleFileName; bundleId.folderName = folderName; BundleId key = bundleId; if (!bundleCache.TryGetValue(key, out var value)) { Dictionary dictionary = bundleCache; AssetBundle? obj = ((IEnumerable)Resources.FindObjectsOfTypeAll()).FirstOrDefault((Func)([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (AssetBundle a) => ((Object)a).name == assetBundleFileName)) ?? AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + "." + folderName + "." + assetBundleFileName)); AssetBundle result = obj; dictionary[key] = obj; return result; } return value; } public static GameObject RegisterPrefab(AssetBundle assets, string prefabName) { GameObject val = assets.LoadAsset(prefabName); prefabs.Add(val); return val; } [HarmonyPriority(700)] private static void Patch_ZNetSceneAwake(ZNetScene __instance) { foreach (GameObject prefab in prefabs) { __instance.m_prefabs.Add(prefab); } } } } namespace BiomeManager { public enum BiomeArea { Edge = 1, Median, Everything } [Nullable(0)] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] public sealed class CustomBiome { public readonly string Id; internal string DisplayName; internal float MinDistance = 0f; internal float MaxDistance = 1f; internal float MinAltitude = -1000f; internal float MaxAltitude = 10000f; internal float CenterX = 0f; internal float CenterY = 0f; internal float Amount = 1f; internal float Stretch = 1f; internal float WiggleDistanceWidth = 100f; internal float WiggleDistanceLength = 20f; internal string Terrain = ""; internal string Nature = ""; internal float AltitudeMultiplier = 1f; internal float WaterDepthMultiplier = 1f; internal float AltitudeDelta = 0f; internal float MinimumAltitude = -1000f; internal float MaximumAltitude = 10000f; internal float ExcessFactor = 0.5f; internal float ForestMultiplier = 1f; internal Color MapColor = new Color(0f, 0f, 0f, 0f); internal Color TerrainColor = new Color(0f, 0f, 0f, 0f); [Nullable(new byte[] { 1, 0, 1 })] internal readonly List<(string name, float weight, bool ash, bool deep)> Environments = new List<(string, float, bool, bool)>(); internal string MusicDay = ""; internal string MusicNight = ""; internal string MusicMorning = "morning"; internal string MusicEvening = "evening"; internal readonly List Clutters = new List(); internal readonly List Vegetations = new List(); public CustomBiome(string id) { //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) Id = id.ToLowerInvariant(); DisplayName = id; } public CustomBiome SetDisplayName(string v) { DisplayName = v; return this; } public CustomBiome SetMinDistance(float v) { MinDistance = v; return this; } public CustomBiome SetMaxDistance(float v) { MaxDistance = v; return this; } public CustomBiome SetMinAltitude(float v) { MinAltitude = v; return this; } public CustomBiome SetMaxAltitude(float v) { MaxAltitude = v; return this; } public CustomBiome SetCenter(float x, float y) { CenterX = x; CenterY = y; return this; } public CustomBiome SetAmount(float v) { Amount = Mathf.Clamp01(v); return this; } public CustomBiome SetStretch(float v) { Stretch = v; return this; } public CustomBiome SetWiggleDistance(bool v) { if (!v) { WiggleDistanceWidth = 0f; } return this; } public CustomBiome SetTerrain(string v) { Terrain = v.ToLowerInvariant(); return this; } public CustomBiome SetNature(string v) { Nature = v.ToLowerInvariant(); return this; } public CustomBiome SetAltitudeMultiplier(float v) { AltitudeMultiplier = v; return this; } public CustomBiome SetWaterDepthMultiplier(float v) { WaterDepthMultiplier = v; return this; } public CustomBiome SetAltitudeDelta(float v) { AltitudeDelta = v; return this; } public CustomBiome SetForestMultiplier(float v) { ForestMultiplier = v; return this; } public CustomBiome SetAltitudeLimits(float min, float max, float excess = 0.5f) { MinimumAltitude = min; MaximumAltitude = max; ExcessFactor = excess; return this; } public CustomBiome SetMapColor(float r, float g, float b, float a = 1f) { //IL_0007: 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) MapColor = new Color(r, g, b, a); return this; } public CustomBiome SetTerrainColor(float r, float g, float b, float a = 1f) { //IL_0007: 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) TerrainColor = new Color(r, g, b, a); return this; } private static Color HexToColor(string hex, float a = 1f) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) hex = hex.TrimStart(new char[1] { '#' }); float num = (float)Convert.ToInt32(hex.Substring(0, 2), 16) / 255f; float num2 = (float)Convert.ToInt32(hex.Substring(2, 2), 16) / 255f; float num3 = (float)Convert.ToInt32(hex.Substring(4, 2), 16) / 255f; return new Color(num, num2, num3, a); } public CustomBiome SetMapColorHex(string hex, float a = 1f) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) MapColor = HexToColor(hex, a); return this; } public CustomBiome SetTerrainColorHex(string hex, float a = 1f) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) TerrainColor = HexToColor(hex, a); return this; } public CustomBiome AddEnvironment(string name, float weight = 1f, bool ashOverride = false, bool deepOverride = false) { Environments.Add((name, weight, ashOverride, deepOverride)); return this; } public CustomBiome SetMusicDay(string v) { MusicDay = v; return this; } public CustomBiome SetMusicNight(string v) { MusicNight = v; return this; } public CustomBiome SetMusicMorning(string v) { MusicMorning = v; return this; } public CustomBiome SetMusicEvening(string v) { MusicEvening = v; return this; } public CustomBiome AddClutter(string prefab, int amount = 10, float scaleMin = 1f, float scaleMax = 1f, bool inForest = true, float forestThresholdMin = 0f, float forestThresholdMax = 1f, float minAlt = -1000f, float maxAlt = 1000f, float minTilt = 0f, float maxTilt = 35f, bool snapToWater = false, float randomOffset = 0.5f) { Clutters.Add(new ClutterEntry(prefab, amount, scaleMin, scaleMax, inForest, forestThresholdMin, forestThresholdMax, minAlt, maxAlt, minTilt, maxTilt, snapToWater, randomOffset)); return this; } public CustomBiome AddVegetation(string prefab, bool enabled = true, float min = 1f, float max = 1f, float scaleMin = 1f, float scaleMax = 1f, float randTilt = 0f, BiomeArea biomeArea = BiomeArea.Everything, bool forcePlacement = false, float minAltitude = 0f, float maxAltitude = 1000f, float maxOceanDepth = 0f, float maxTilt = 90f, float maxTerrainDelta = 2f, float forestThresholdMin = 0f, float forestThresholdMax = 1f, int groupSizeMin = 1, int groupSizeMax = 1, float groupRadius = 0f, bool inForest = false) { Vegetations.Add(new VegetationEntry(prefab, enabled, min, max, scaleMin, scaleMax, randTilt, biomeArea, forcePlacement, minAltitude, maxAltitude, maxOceanDepth, maxTilt, maxTerrainDelta, forestThresholdMin, forestThresholdMax, groupSizeMin, groupSizeMax, groupRadius, inForest)); return this; } public void Register() { BiomeManager.Register(this); } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public sealed class ClutterEntry { public readonly string Prefab; public readonly int Amount; public readonly float ScaleMin; public readonly float ScaleMax; public readonly bool InForest; public readonly float ForestThresholdMin; public readonly float ForestThresholdMax; public readonly float MinAlt; public readonly float MaxAlt; public readonly float MinTilt; public readonly float MaxTilt; public readonly bool SnapToWater; public readonly float RandomOffset; public ClutterEntry(string p, int a, float sMin, float sMax, bool inf, float ftMin, float ftMax, float minA, float maxA, float minT, float maxT, bool snap, float roff) { Prefab = p; Amount = a; ScaleMin = sMin; ScaleMax = sMax; InForest = inf; ForestThresholdMin = ftMin; ForestThresholdMax = ftMax; MinAlt = minA; MaxAlt = maxA; MinTilt = minT; MaxTilt = maxT; SnapToWater = snap; RandomOffset = roff; } } [Nullable(0)] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] public sealed class VegetationEntry { public readonly string Prefab; public readonly bool Enabled; public readonly float Min; public readonly float Max; public readonly float ScaleMin; public readonly float ScaleMax; public readonly float RandTilt; public readonly BiomeArea BiomeArea; public readonly bool ForcePlacement; public readonly float MinAltitude; public readonly float MaxAltitude; public readonly float MaxOceanDepth; public readonly float MaxTilt; public readonly float MaxTerrainDelta; public readonly float ForestThresholdMin; public readonly float ForestThresholdMax; public readonly int GroupSizeMin; public readonly int GroupSizeMax; public readonly float GroupRadius; public readonly bool InForest; public VegetationEntry(string prefab, bool enabled, float min, float max, float scaleMin, float scaleMax, float randTilt, BiomeArea biomeArea, bool forcePlacement, float minAltitude, float maxAltitude, float maxOceanDepth, float maxTilt, float maxTerrainDelta, float forestThresholdMin, float forestThresholdMax, int groupSizeMin, int groupSizeMax, float groupRadius, bool inForest) { Prefab = prefab; Enabled = enabled; Min = min; Max = max; ScaleMin = scaleMin; ScaleMax = scaleMax; RandTilt = randTilt; BiomeArea = biomeArea; ForcePlacement = forcePlacement; MinAltitude = minAltitude; MaxAltitude = maxAltitude; MaxOceanDepth = maxOceanDepth; MaxTilt = maxTilt; MaxTerrainDelta = maxTerrainDelta; ForestThresholdMin = forestThresholdMin; ForestThresholdMax = forestThresholdMax; GroupSizeMin = groupSizeMin; GroupSizeMax = groupSizeMax; GroupRadius = groupRadius; InForest = inForest; } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] public static class BiomeManager { [Nullable(0)] public sealed class VanillaBiomeBuilder { private readonly Biome _biome; public VanillaBiomeBuilder(Biome biome) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) _biome = biome; } public VanillaBiomeBuilder AddVegetation(string prefab, bool enabled = true, float min = 1f, float max = 1f, float scaleMin = 1f, float scaleMax = 1f, float randTilt = 0f, BiomeArea biomeArea = BiomeArea.Everything, bool forcePlacement = false, float minAltitude = 0f, float maxAltitude = 1000f, float maxOceanDepth = 0f, float maxTilt = 90f, float maxTerrainDelta = 2f, float forestThresholdMin = 0f, float forestThresholdMax = 1f, int groupSizeMin = 1, int groupSizeMax = 1, float groupRadius = 0f, bool inForest = false) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) AddVegetationToBiome(_biome, prefab, enabled, min, max, scaleMin, scaleMax, randTilt, biomeArea, forcePlacement, minAltitude, maxAltitude, maxOceanDepth, maxTilt, maxTerrainDelta, forestThresholdMin, forestThresholdMax, groupSizeMin, groupSizeMax, groupRadius, inForest); return this; } public VanillaBiomeBuilder AddClutter(string prefab, int amount = 10, float scaleMin = 1f, float scaleMax = 1f, bool inForest = true, float forestThresholdMin = 0f, float forestThresholdMax = 1f, float minAlt = -1000f, float maxAlt = 1000f, float minTilt = 0f, float maxTilt = 35f, bool snapToWater = false, float randomOffset = 0.5f) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) AddClutterToBiome(_biome, prefab, amount, scaleMin, scaleMax, inForest, forestThresholdMin, forestThresholdMax, minAlt, maxAlt, minTilt, maxTilt, snapToWater, randomOffset); return this; } public VanillaBiomeBuilder SetForestMultiplier(float multiplier) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) SetForestMultiplierForBiome(_biome, multiplier); return this; } } private const string KEY_PRIMARY = "BiomeManager_Primary_v3"; private const string KEY_LIST = "BiomeManager_List_v3"; private const string HARMONY_ID = "com.biomemanager.v3"; private static readonly string _myId = typeof(BiomeManager).Assembly.FullName; private static bool _patchesApplied; private static bool? _isPrimary; [Nullable(2)] private static BiomeManagerRunner _runner; internal static readonly Dictionary NameToEnum = new Dictionary(StringComparer.OrdinalIgnoreCase); internal static readonly Dictionary EnumToName = new Dictionary(); internal static readonly Dictionary BiomeData = new Dictionary(); internal static readonly Dictionary> VanillaBiomeVegetations = new Dictionary>(); internal static readonly Dictionary> VanillaBiomeClutters = new Dictionary>(); internal static readonly Dictionary VanillaBiomeForestMultipliers = new Dictionary(); internal static readonly Dictionary BiomeToTerrain = new Dictionary(); internal static readonly Dictionary BiomeToNature = new Dictionary(); internal static readonly Dictionary Offsets = new Dictionary(); [Nullable(new byte[] { 1, 0, 1 })] private static readonly (string n, Biome v)[] Vanilla = new(string, Biome)[10] { ("None", (Biome)0), ("Meadows", (Biome)1), ("Swamp", (Biome)2), ("Mountain", (Biome)4), ("BlackForest", (Biome)8), ("Plains", (Biome)16), ("AshLands", (Biome)32), ("DeepNorth", (Biome)64), ("Ocean", (Biome)256), ("Mistlands", (Biome)512) }; private static bool _built = false; internal static float _playerSpawnTime = -1f; internal static BiomeManagerRunner Runner { get { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown if ((Object)(object)_runner != (Object)null) { return _runner; } GameObject val = new GameObject("BiomeManager_Runner"); Object.DontDestroyOnLoad((Object)(object)val); _runner = val.AddComponent(); return _runner; } } private static List SharedList { get { List list = AppDomain.CurrentDomain.GetData("BiomeManager_List_v3") as List; if (list == null) { list = new List(); AppDomain.CurrentDomain.SetData("BiomeManager_List_v3", list); } return list; } } internal static bool IsPrimary { get { if (_isPrimary.HasValue) { return _isPrimary.Value; } _isPrimary = AppDomain.CurrentDomain.GetData("BiomeManager_Primary_v3") as string == _myId; return _isPrimary.Value; } } public static void Register(CustomBiome biome) { List sharedList = SharedList; if (sharedList.Any([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (CustomBiome b) => b.Id == biome.Id)) { throw new InvalidOperationException("[BiomeManager] '" + biome.Id + "' already registered."); } sharedList.Add(biome); EnsureInitialized(); } public static void AddVegetationToBiome(Biome biome, string prefab, bool enabled = true, float min = 1f, float max = 1f, float scaleMin = 1f, float scaleMax = 1f, float randTilt = 0f, BiomeArea biomeArea = BiomeArea.Everything, bool forcePlacement = false, float minAltitude = 0f, float maxAltitude = 1000f, float maxOceanDepth = 0f, float maxTilt = 90f, float maxTerrainDelta = 2f, float forestThresholdMin = 0f, float forestThresholdMax = 1f, int groupSizeMin = 1, int groupSizeMax = 1, float groupRadius = 0f, bool inForest = false) { //IL_000c: 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) EnsureInitialized(); if (!VanillaBiomeVegetations.TryGetValue(biome, out var value)) { value = new List(); VanillaBiomeVegetations[biome] = value; } value.Add(new VegetationEntry(prefab, enabled, min, max, scaleMin, scaleMax, randTilt, biomeArea, forcePlacement, minAltitude, maxAltitude, maxOceanDepth, maxTilt, maxTerrainDelta, forestThresholdMin, forestThresholdMax, groupSizeMin, groupSizeMax, groupRadius, inForest)); } public static void AddClutterToBiome(Biome biome, string prefab, int amount = 10, float scaleMin = 1f, float scaleMax = 1f, bool inForest = true, float forestThresholdMin = 0f, float forestThresholdMax = 1f, float minAlt = -1000f, float maxAlt = 1000f, float minTilt = 0f, float maxTilt = 35f, bool snapToWater = false, float randomOffset = 0.5f) { //IL_000c: 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) EnsureInitialized(); if (!VanillaBiomeClutters.TryGetValue(biome, out var value)) { value = new List(); VanillaBiomeClutters[biome] = value; } value.Add(new ClutterEntry(prefab, amount, scaleMin, scaleMax, inForest, forestThresholdMin, forestThresholdMax, minAlt, maxAlt, minTilt, maxTilt, snapToWater, randomOffset)); } public static VanillaBiomeBuilder ForVanillaBiome(Biome biome) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return new VanillaBiomeBuilder(biome); } public static void SetForestMultiplierForBiome(Biome biome, float multiplier) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) EnsureInitialized(); VanillaBiomeForestMultipliers[biome] = Mathf.Max(0f, multiplier); } private static void EnsureInitialized() { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown if (_patchesApplied) { return; } _patchesApplied = true; if (AppDomain.CurrentDomain.GetData("BiomeManager_Primary_v3") == null) { AppDomain.CurrentDomain.SetData("BiomeManager_Primary_v3", _myId); } _isPrimary = AppDomain.CurrentDomain.GetData("BiomeManager_Primary_v3") as string == _myId; SetupBiomeArrays(); Harmony val = new Harmony("com.biomemanager.v3"); foreach (Type item in from t in typeof(BiomeManager).Assembly.GetTypes() where t.Namespace == "BiomeManager" select t) { try { val.CreateClassProcessor(item).Patch(); } catch (Exception ex) { Log("Patch failed " + item.Name + ": " + ex.Message); } } } public static void SetHost(BaseUnityPlugin host) { } internal static void Build() { //IL_0068: 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_0077: 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_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Expected I4, but got Unknown if (_built) { return; } _built = true; NameToEnum.Clear(); EnumToName.Clear(); BiomeData.Clear(); BiomeToTerrain.Clear(); BiomeToNature.Clear(); (string, Biome)[] vanilla = Vanilla; for (int i = 0; i < vanilla.Length; i++) { var (text, val) = vanilla[i]; NameToEnum[text] = val; EnumToName[val] = text; } List list = SharedList.OrderBy([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (CustomBiome b) => b.Id).ToList(); Biome val2 = (Biome)512; foreach (CustomBiome item in list) { val2 = NextBiome(val2); NameToEnum[item.Id] = val2; EnumToName[val2] = item.Id; BiomeData[val2] = item; } foreach (CustomBiome item2 in list) { Biome val3 = NameToEnum[item2.Id]; Biome value; Biome val4 = ((!string.IsNullOrEmpty(item2.Terrain) && NameToEnum.TryGetValue(item2.Terrain, out value)) ? value : val3); BiomeToTerrain[val3] = val4; Biome value2; Biome value3 = ((!string.IsNullOrEmpty(item2.Nature) && NameToEnum.TryGetValue(item2.Nature, out value2)) ? value2 : val4); BiomeToNature[val3] = value3; } if (Localization.instance != null) { foreach (CustomBiome item3 in list) { Biome val5 = NameToEnum[item3.Id]; string key = "biome_" + item3.Id; string key2 = "biome_" + (int)val5; Localization.instance.m_translations[key] = item3.DisplayName; Localization.instance.m_translations[key2] = item3.DisplayName; } } Log($"Registered {list.Count} custom biome(s)."); } internal static void InvokeRegenerate() { if (IsPrimary) { WorldGenerator instance = WorldGenerator.instance; if (instance != null && instance.m_world?.m_menu == false) { Runner.ScheduleRegenerate(); } } } internal static void AutomaticRegenerate() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Invalid comparison between Unknown and I4 if (WorldGenerator.instance == null) { return; } Log("Regenerating the world."); WorldGenerator.instance.Pregenerate(); Heightmap[] array = Object.FindObjectsByType((FindObjectsInactive)0, (FindObjectsSortMode)0); foreach (Heightmap val in array) { val.m_buildData = null; val.Regenerate(); } LoadClutter(); ClutterSystem instance = ClutterSystem.instance; if (instance != null) { instance.ClearAll(); } bool flag = (int)SystemInfo.graphicsDeviceType != 4; bool flag2 = (Object)(object)Player.m_localPlayer != (Object)null; bool flag3 = _playerSpawnTime > 0f && Time.time - _playerSpawnTime > 120f; if (flag && flag2 && flag3) { Minimap instance2 = Minimap.instance; if (instance2 != null) { instance2.GenerateWorldMap(); } } } internal static void LoadEnvironments() { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: 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_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Expected O, but got Unknown if (BiomeData.Count == 0 && VanillaBiomeVegetations.Count == 0 && VanillaBiomeClutters.Count == 0) { return; } EnvMan instance = EnvMan.instance; if ((Object)(object)instance == (Object)null) { return; } foreach (KeyValuePair biomeDatum in BiomeData) { Biome enumVal = biomeDatum.Key; CustomBiome value = biomeDatum.Value; if (value.Environments.Count != 0 || !string.IsNullOrEmpty(value.MusicDay)) { instance.m_biomes.RemoveAll([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (BiomeEnvSetup x) => x.m_biome == enumVal); instance.AppendBiomeSetup(new BiomeEnvSetup { m_name = value.Id, m_biome = enumVal, m_musicDay = value.MusicDay, m_musicNight = value.MusicNight, m_musicMorning = value.MusicMorning, m_musicEvening = value.MusicEvening, m_environments = ((IEnumerable<(string, float, bool, bool)>)value.Environments).Select((Func<(string, float, bool, bool), EnvEntry>)([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] ((string name, float weight, bool ash, bool deep) e) => { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: 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_001d: 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_0036: Expected O, but got Unknown EnvEntry val = new EnvEntry(); (val.m_environment, val.m_weight, val.m_ashlandsOverride, val.m_deepnorthOverride) = e; return val; })).ToList() }); } } instance.m_environmentPeriod = -1L; instance.m_firstEnv = true; Log("Environments (Clima/Musica) registrados com sucesso."); } internal static void LoadClutter() { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0369: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_030e: Expected O, but got Unknown //IL_0512: Unknown result type (might be due to invalid IL or missing references) //IL_0517: Unknown result type (might be due to invalid IL or missing references) //IL_051f: Unknown result type (might be due to invalid IL or missing references) //IL_0527: Unknown result type (might be due to invalid IL or missing references) //IL_0528: Unknown result type (might be due to invalid IL or missing references) //IL_052a: Unknown result type (might be due to invalid IL or missing references) //IL_052f: Unknown result type (might be due to invalid IL or missing references) //IL_0536: Unknown result type (might be due to invalid IL or missing references) //IL_053e: Unknown result type (might be due to invalid IL or missing references) //IL_054b: Unknown result type (might be due to invalid IL or missing references) //IL_0558: Unknown result type (might be due to invalid IL or missing references) //IL_0565: Unknown result type (might be due to invalid IL or missing references) //IL_0572: Unknown result type (might be due to invalid IL or missing references) //IL_057f: Unknown result type (might be due to invalid IL or missing references) //IL_058c: Unknown result type (might be due to invalid IL or missing references) //IL_0599: Unknown result type (might be due to invalid IL or missing references) //IL_05a6: Unknown result type (might be due to invalid IL or missing references) //IL_05b3: Unknown result type (might be due to invalid IL or missing references) //IL_05c0: Unknown result type (might be due to invalid IL or missing references) //IL_05cd: Unknown result type (might be due to invalid IL or missing references) //IL_05df: Expected O, but got Unknown if (BiomeData.Count == 0 && VanillaBiomeVegetations.Count == 0 && VanillaBiomeClutters.Count == 0) { return; } ClutterSystem instance = ClutterSystem.instance; if ((Object)(object)instance == (Object)null) { return; } foreach (KeyValuePair biomeDatum in BiomeData) { Biome enumVal = biomeDatum.Key; CustomBiome value = biomeDatum.Value; instance.m_clutter.RemoveAll([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (Clutter c) => c.m_biome == enumVal); foreach (ClutterEntry clutter in value.Clutters) { GameObject val = null; string name = clutter.Prefab; foreach (Clutter item in instance.m_clutter) { if ((Object)(object)item.m_prefab != (Object)null && ((Object)item.m_prefab).name == clutter.Prefab) { val = item.m_prefab; if (!string.IsNullOrEmpty(item.m_name)) { name = item.m_name; } break; } } if ((Object)(object)val == (Object)null) { ZNetScene instance2 = ZNetScene.instance; val = ((instance2 != null) ? instance2.GetPrefab(clutter.Prefab) : null); } if ((Object)(object)val == (Object)null) { Log("Clutter prefab not found: " + clutter.Prefab); continue; } bool flag = false; foreach (Clutter item2 in instance.m_clutter) { if ((Object)(object)item2.m_prefab != (Object)null && ((Object)item2.m_prefab).name == clutter.Prefab) { flag = item2.m_instanced; break; } } if (!flag) { flag = clutter.Prefab.StartsWith("instanced_"); } instance.m_clutter.Add(new Clutter { m_name = name, m_prefab = val, m_biome = enumVal, m_enabled = true, m_instanced = flag, m_amount = clutter.Amount, m_scaleMin = clutter.ScaleMin, m_scaleMax = clutter.ScaleMax, m_inForest = clutter.InForest, m_forestTresholdMin = clutter.ForestThresholdMin, m_forestTresholdMax = clutter.ForestThresholdMax, m_minAlt = clutter.MinAlt, m_maxAlt = clutter.MaxAlt, m_minTilt = clutter.MinTilt, m_maxTilt = clutter.MaxTilt, m_snapToWater = clutter.SnapToWater, m_randomOffset = clutter.RandomOffset }); } } foreach (KeyValuePair> vanillaBiomeClutter in VanillaBiomeClutters) { Biome key = vanillaBiomeClutter.Key; foreach (ClutterEntry item3 in vanillaBiomeClutter.Value) { GameObject val2 = null; string name2 = item3.Prefab; foreach (Clutter item4 in instance.m_clutter) { if ((Object)(object)item4.m_prefab != (Object)null && ((Object)item4.m_prefab).name == item3.Prefab) { val2 = item4.m_prefab; if (!string.IsNullOrEmpty(item4.m_name)) { name2 = item4.m_name; } break; } } if ((Object)(object)val2 == (Object)null) { ZNetScene instance3 = ZNetScene.instance; val2 = ((instance3 != null) ? instance3.GetPrefab(item3.Prefab) : null); } if ((Object)(object)val2 == (Object)null) { Log("Clutter prefab not found: " + item3.Prefab); continue; } bool flag2 = false; foreach (Clutter item5 in instance.m_clutter) { if ((Object)(object)item5.m_prefab != (Object)null && ((Object)item5.m_prefab).name == item3.Prefab) { flag2 = item5.m_instanced; break; } } if (!flag2) { flag2 = item3.Prefab.StartsWith("instanced_"); } instance.m_clutter.Add(new Clutter { m_name = name2, m_prefab = val2, m_biome = key, m_enabled = true, m_instanced = flag2, m_amount = item3.Amount, m_scaleMin = item3.ScaleMin, m_scaleMax = item3.ScaleMax, m_inForest = item3.InForest, m_forestTresholdMin = item3.ForestThresholdMin, m_forestTresholdMax = item3.ForestThresholdMax, m_minAlt = item3.MinAlt, m_maxAlt = item3.MaxAlt, m_minTilt = item3.MinTilt, m_maxTilt = item3.MaxTilt, m_snapToWater = item3.SnapToWater, m_randomOffset = item3.RandomOffset }); } } instance.ClearAll(); Log("Clutter registrado."); } internal static void LoadVegetation() { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0122: 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_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Expected O, but got Unknown //IL_0347: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Unknown result type (might be due to invalid IL or missing references) //IL_0366: Unknown result type (might be due to invalid IL or missing references) //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_0380: Unknown result type (might be due to invalid IL or missing references) //IL_038d: Unknown result type (might be due to invalid IL or missing references) //IL_039a: Unknown result type (might be due to invalid IL or missing references) //IL_03a7: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Unknown result type (might be due to invalid IL or missing references) //IL_03b4: Unknown result type (might be due to invalid IL or missing references) //IL_03b9: Unknown result type (might be due to invalid IL or missing references) //IL_03c1: Unknown result type (might be due to invalid IL or missing references) //IL_03c6: Unknown result type (might be due to invalid IL or missing references) //IL_03d3: Unknown result type (might be due to invalid IL or missing references) //IL_03e0: Unknown result type (might be due to invalid IL or missing references) //IL_03ed: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_0407: Unknown result type (might be due to invalid IL or missing references) //IL_0414: Unknown result type (might be due to invalid IL or missing references) //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_042e: Unknown result type (might be due to invalid IL or missing references) //IL_043b: Unknown result type (might be due to invalid IL or missing references) //IL_0448: Unknown result type (might be due to invalid IL or missing references) //IL_0455: Unknown result type (might be due to invalid IL or missing references) //IL_0467: Expected O, but got Unknown if (BiomeData.Count == 0 && VanillaBiomeVegetations.Count == 0 && VanillaBiomeClutters.Count == 0) { return; } ZoneSystem instance = ZoneSystem.instance; if ((Object)(object)instance == (Object)null) { return; } foreach (KeyValuePair biomeDatum in BiomeData) { Biome enumVal2 = biomeDatum.Key; CustomBiome value = biomeDatum.Value; foreach (VegetationEntry vegetation in value.Vegetations) { ZNetScene instance2 = ZNetScene.instance; GameObject prefab2 = ((instance2 != null) ? instance2.GetPrefab(vegetation.Prefab) : null); if ((Object)(object)prefab2 == (Object)null) { Log("Vegetation prefab not found: " + vegetation.Prefab); continue; } instance.m_vegetation.RemoveAll([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (ZoneVegetation v) => (Object)(object)v.m_prefab == (Object)(object)prefab2 && v.m_biome == enumVal2); instance.m_vegetation.Add(new ZoneVegetation { m_prefab = prefab2, m_enable = vegetation.Enabled, m_min = vegetation.Min, m_max = vegetation.Max, m_scaleMin = vegetation.ScaleMin, m_scaleMax = vegetation.ScaleMax, m_randTilt = vegetation.RandTilt, m_biome = enumVal2, m_biomeArea = (BiomeArea)vegetation.BiomeArea, m_forcePlacement = vegetation.ForcePlacement, m_minAltitude = vegetation.MinAltitude, m_maxAltitude = vegetation.MaxAltitude, m_maxOceanDepth = vegetation.MaxOceanDepth, m_maxTilt = vegetation.MaxTilt, m_maxTerrainDelta = vegetation.MaxTerrainDelta, m_forestTresholdMin = vegetation.ForestThresholdMin, m_forestTresholdMax = vegetation.ForestThresholdMax, m_groupSizeMin = vegetation.GroupSizeMin, m_groupSizeMax = vegetation.GroupSizeMax, m_groupRadius = vegetation.GroupRadius, m_inForest = vegetation.InForest }); } } foreach (KeyValuePair> vanillaBiomeVegetation in VanillaBiomeVegetations) { Biome enumVal = vanillaBiomeVegetation.Key; foreach (VegetationEntry item in vanillaBiomeVegetation.Value) { ZNetScene instance3 = ZNetScene.instance; GameObject prefab = ((instance3 != null) ? instance3.GetPrefab(item.Prefab) : null); if ((Object)(object)prefab == (Object)null) { Log("Vegetation prefab not found: " + item.Prefab); continue; } instance.m_vegetation.RemoveAll([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (ZoneVegetation v) => (Object)(object)v.m_prefab == (Object)(object)prefab && v.m_biome == enumVal); instance.m_vegetation.Add(new ZoneVegetation { m_prefab = prefab, m_enable = item.Enabled, m_min = item.Min, m_max = item.Max, m_scaleMin = item.ScaleMin, m_scaleMax = item.ScaleMax, m_randTilt = item.RandTilt, m_biome = enumVal, m_biomeArea = (BiomeArea)item.BiomeArea, m_forcePlacement = item.ForcePlacement, m_minAltitude = item.MinAltitude, m_maxAltitude = item.MaxAltitude, m_maxOceanDepth = item.MaxOceanDepth, m_maxTilt = item.MaxTilt, m_maxTerrainDelta = item.MaxTerrainDelta, m_forestTresholdMin = item.ForestThresholdMin, m_forestTresholdMax = item.ForestThresholdMax, m_groupSizeMin = item.GroupSizeMin, m_groupSizeMax = item.GroupSizeMax, m_groupRadius = item.GroupRadius, m_inForest = item.InForest }); } } Log("Vegetation registered."); } internal static Biome GetBiomeAt(WorldGenerator wg, float wx, float wy) { //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_0015: 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_02a7: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) if (BiomeData.Count == 0) { return (Biome)0; } float num = Mathf.Atan2(wx, wy); float num2 = wx * WorldInfo.Stretch; float num3 = wy * WorldInfo.Stretch; Vector2 val = new Vector2(num2, num3); float magnitude = ((Vector2)(ref val)).magnitude; if (magnitude > WorldInfo.TotalRadius) { return (Biome)0; } float num4 = wg.GetBaseHeight(wx, wy, false) * 200f - WorldInfo.WaterLevel; float radius = WorldInfo.Radius; float num5 = wx / WorldInfo.BiomeStretch; float num6 = wy / WorldInfo.BiomeStretch; foreach (CustomBiome item in BiomeData.Values.OrderBy([<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] (CustomBiome x) => x.Id)) { if (item.MinAltitude >= num4 || item.MaxAltitude <= num4) { continue; } float num7 = magnitude; float num8 = item.MinDistance * radius; float num9 = item.MaxDistance * radius; if (item.CenterX != 0f || item.CenterY != 0f) { val = new Vector2(num2 - item.CenterX * radius, num3 - item.CenterY * radius); num7 = ((Vector2)(ref val)).magnitude; } if (num8 > 0f && item.WiggleDistanceWidth > 0f) { num8 += Mathf.Sin(num * item.WiggleDistanceLength) * item.WiggleDistanceWidth; } else if (num8 == 0f) { num8 = -0.1f; } if (!(num7 > num8) || (!(num9 >= radius) && !(num7 < num9))) { continue; } if (item.Amount < 1f && NameToEnum.TryGetValue(item.Id, out var value)) { float value2; float num10 = (Offsets.TryGetValue(value, out value2) ? value2 : 0f); if (Mathf.PerlinNoise((num10 + num5 / item.Stretch) * 0.001f, (num10 + num6 / item.Stretch) * 0.001f) <= 1f - item.Amount) { continue; } } if (!NameToEnum.TryGetValue(item.Id, out var value3)) { continue; } return value3; } return (Biome)0; } internal static Biome GetTerrain(Biome biome) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) Biome value; return BiomeToTerrain.TryGetValue(biome, out value) ? value : biome; } internal static Biome GetNature(Biome biome) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) Biome value; return BiomeToNature.TryGetValue(biome, out value) ? value : biome; } internal static bool TryGetBiome(string name, out Biome b) { return NameToEnum.TryGetValue(name, out b); } internal static bool TryGetData(Biome biome, out CustomBiome data) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return BiomeData.TryGetValue(biome, out data); } private unsafe static void SetupBiomeArrays() { float[] array = new float[33]; Biome[] array2 = array.Select((float _, int i) => (Biome)((i < 2) ? i : (2 << i - 2))).ToArray(); fixed (Biome[]* ptr = &Heightmap.s_indexToBiome) { void* ptr2 = ptr; System.Runtime.CompilerServices.Unsafe.Write(ptr2, array2); } fixed (float[]* ptr3 = &Heightmap.s_tempBiomeWeights) { void* ptr4 = ptr3; System.Runtime.CompilerServices.Unsafe.Write(ptr4, array); } for (int j = 0; j < array2.Length; j++) { Heightmap.s_biomeToIndex[array2[j]] = j; } } private static Biome NextBiome(Biome b) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Expected I4, but got Unknown //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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) uint num = (uint)(int)b; return (Biome)(num switch { 128u => throw new Exception("[BiomeManager] Max biomes reached."), 2147483648u => 128, _ => num * 2, }); } internal static void Log(string msg) { Debug.Log((object)("[BiomeManager] " + msg)); } } internal static class WorldInfo { public static float WaterLevel = 30f; public static float Radius = 10000f; public static float TotalRadius = 10500f; public static float Stretch = 1f; public static float BiomeStretch = 1f; } [HarmonyPriority(100)] [HarmonyPatch(typeof(WorldGenerator), "VersionSetup")] internal static class Patch_VersionSetup { private static void Postfix() { if (BiomeManager.IsPrimary) { BiomeManager.Build(); } } } [HarmonyPriority(100)] [HarmonyPatch(typeof(ZoneSystem), "Start")] internal static class Patch_ZoneSystem_Start { internal static bool _loaded; private static void Postfix() { if (BiomeManager.IsPrimary && (BiomeManager.BiomeData.Count != 0 || BiomeManager.VanillaBiomeVegetations.Count != 0) && !_loaded) { _loaded = true; BiomeManager.LoadEnvironments(); BiomeManager.LoadClutter(); BiomeManager.LoadVegetation(); } } } [HarmonyPatch(typeof(ZoneSystem), "OnDestroy")] internal static class Patch_ZoneSystem_OnDestroy { private static void Postfix() { Patch_ZoneSystem_Start._loaded = false; } } [HarmonyPatch(typeof(ZNet), "Awake")] internal static class Patch_ZNetTimeout { private static void Postfix() { if (ZRpc.m_timeout < 90f) { ZRpc.m_timeout = 90f; } BiomeManager._playerSpawnTime = -1f; } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [Nullable(0)] [HarmonyPatch(typeof(Minimap), "GenerateWorldMap")] internal static class Patch_GenerateWorldMap_Async { [CompilerGenerated] private sealed class <>c__DisplayClass8_0 { public int half; public float pxSize; public float halfPx; [Nullable(0)] public WorldGenerator wg; public int size; [Nullable(0)] public Color32[] colors1; [Nullable(new byte[] { 0, 1 })] public Func getPixelColor; [Nullable(0)] public Minimap instance; [Nullable(0)] public Color32[] colors2; [Nullable(new byte[] { 0, 1 })] public Func getMaskColor; [Nullable(0)] public Color[] colors3; [Nullable(0)] public Color32[] colors4; public bool abort; public bool done; internal void b__0() { //IL_0050: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) try { Color val = default(Color); for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { float num = (float)(j - half) * pxSize + halfPx; float num2 = (float)(i - half) * pxSize + halfPx; Biome biome = wg.GetBiome(num, num2, 0.02f, false); float biomeHeight = wg.GetBiomeHeight(biome, num, num2, ref val, false); int num3 = i * size + j; colors1[num3] = Color32.op_Implicit(getPixelColor(instance, biome)); colors2[num3] = Color32.op_Implicit(getMaskColor(instance, num, num2, biomeHeight, biome)); colors3[num3].r = biomeHeight; int num4 = Mathf.Clamp((int)(biomeHeight * 127.5f), 0, 65025); colors4[num3] = new Color32((byte)(num4 >> 8), (byte)((uint)num4 & 0xFFu), (byte)0, byte.MaxValue); } } } catch (Exception ex) { ZLog.LogWarning((object)("[BiomeManager] GenerateAsync thread erro: " + ex.Message)); abort = true; } finally { done = true; } } } [CompilerGenerated] private sealed class d__8 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; [Nullable(0)] private object <>2__current; [Nullable(0)] public Minimap instance; [Nullable(0)] private <>c__DisplayClass8_0 <>8__1; private float 5__2; [Nullable(0)] private Stopwatch 5__3; [Nullable(0)] private Texture2D 5__4; [Nullable(0)] private Texture2D 5__5; [Nullable(0)] private Texture2D 5__6; [Nullable(0)] private Texture2D 5__7; object IEnumerator.Current { [DebuggerHidden] [return: Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public d__8(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; 5__3 = null; 5__4 = null; 5__5 = null; 5__6 = null; 5__7 = null; <>1__state = -2; } private bool MoveNext() { //IL_03e8: Unknown result type (might be due to invalid IL or missing references) //IL_03f2: Expected O, but got Unknown //IL_0435: Unknown result type (might be due to invalid IL or missing references) //IL_043b: Invalid comparison between Unknown and I4 //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass8_0(); <>8__1.instance = instance; if ((Object)(object)<>8__1.instance == (Object)null) { ZLog.LogWarning((object)"[BiomeManager] GenerateAsync: instance é null, abortando"); return false; } 5__2 = 0f; goto IL_00d0; case 1: <>1__state = -1; goto IL_00d0; case 2: <>1__state = -1; if ((Object)(object)<>8__1.instance == (Object)null || WorldGenerator.instance == null || ZNet.World == null) { ZLog.LogWarning((object)"[BiomeManager] GenerateAsync: referências inválidas após delay, abortando"); return false; } Minimap.DeleteMapTextureData(ZNet.World.m_name); <>8__1.size = <>8__1.instance.m_textureSize; <>8__1.pxSize = <>8__1.instance.m_pixelSize; <>8__1.half = <>8__1.size / 2; <>8__1.halfPx = <>8__1.pxSize / 2f; <>8__1.wg = WorldGenerator.instance; <>8__1.getPixelColor = _getPixelColor; <>8__1.getMaskColor = _getMaskColor; <>8__1.colors1 = (Color32[])(object)new Color32[<>8__1.size * <>8__1.size]; <>8__1.colors2 = (Color32[])(object)new Color32[<>8__1.size * <>8__1.size]; <>8__1.colors3 = (Color[])(object)new Color[<>8__1.size * <>8__1.size]; <>8__1.colors4 = (Color32[])(object)new Color32[<>8__1.size * <>8__1.size]; 5__3 = Stopwatch.StartNew(); <>8__1.done = false; <>8__1.abort = false; Task.Run(delegate { //IL_0050: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) try { Color val = default(Color); for (int i = 0; i < <>8__1.size; i++) { for (int j = 0; j < <>8__1.size; j++) { float num = (float)(j - <>8__1.half) * <>8__1.pxSize + <>8__1.halfPx; float num2 = (float)(i - <>8__1.half) * <>8__1.pxSize + <>8__1.halfPx; Biome biome = <>8__1.wg.GetBiome(num, num2, 0.02f, false); float biomeHeight = <>8__1.wg.GetBiomeHeight(biome, num, num2, ref val, false); int num3 = i * <>8__1.size + j; <>8__1.colors1[num3] = Color32.op_Implicit(<>8__1.getPixelColor(<>8__1.instance, biome)); <>8__1.colors2[num3] = Color32.op_Implicit(<>8__1.getMaskColor(<>8__1.instance, num, num2, biomeHeight, biome)); <>8__1.colors3[num3].r = biomeHeight; int num4 = Mathf.Clamp((int)(biomeHeight * 127.5f), 0, 65025); <>8__1.colors4[num3] = new Color32((byte)(num4 >> 8), (byte)((uint)num4 & 0xFFu), (byte)0, byte.MaxValue); } } } catch (Exception ex) { ZLog.LogWarning((object)("[BiomeManager] GenerateAsync thread erro: " + ex.Message)); <>8__1.abort = true; } finally { <>8__1.done = true; } }); break; case 3: { <>1__state = -1; break; } IL_00d0: if (WorldGenerator.instance == null || ZNet.World == null) { 5__2 += Time.deltaTime; if (5__2 > 60f) { ZLog.LogWarning((object)"[BiomeManager] GenerateAsync: WorldGenerator não ficou pronto em 60s, abortando."); return false; } <>2__current = null; <>1__state = 1; return true; } <>2__current = (object)new WaitForSeconds(1f); <>1__state = 2; return true; } if (!<>8__1.done) { if ((Object)(object)Minimap.instance == (Object)null) { return false; } <>2__current = null; <>1__state = 3; return true; } if (<>8__1.abort) { return false; } 5__4 = _mapTexRef.Invoke(<>8__1.instance); 5__5 = _forestRef.Invoke(<>8__1.instance); 5__6 = _heightRef.Invoke(<>8__1.instance); 5__5.SetPixels32(<>8__1.colors2); 5__5.Apply(); 5__4.SetPixels32(<>8__1.colors1); 5__4.Apply(); 5__6.SetPixels(<>8__1.colors3); 5__6.Apply(); 5__7 = new Texture2D(<>8__1.size, <>8__1.size); 5__7.SetPixels32(<>8__1.colors4); 5__7.Apply(); ZLog.Log((object)$"Generating new world minimap done [{5__3.ElapsedMilliseconds}ms] (thread)"); if ((int)FileHelpers.LocalStorageSupport == 2) { _saveTextures?.Invoke(<>8__1.instance, 5__5, 5__4, 5__7); } _activeCoroutine = null; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static readonly FieldRef _mapTexRef = AccessTools.FieldRefAccess("m_mapTexture"); private static readonly FieldRef _forestRef = AccessTools.FieldRefAccess("m_forestMaskTexture"); private static readonly FieldRef _heightRef = AccessTools.FieldRefAccess("m_heightTexture"); private static readonly Func _getPixelColor = AccessTools.MethodDelegate>(AccessTools.Method(typeof(Minimap), "GetPixelColor", new Type[1] { typeof(Biome) }, (Type[])null), (object)null, true); private static readonly Func _getMaskColor = AccessTools.MethodDelegate>(AccessTools.Method(typeof(Minimap), "GetMaskColor", new Type[4] { typeof(float), typeof(float), typeof(float), typeof(Biome) }, (Type[])null), (object)null, true); private static readonly Action _saveTextures = AccessTools.MethodDelegate>(AccessTools.Method(typeof(Minimap), "SaveMapTextureDataToDisk", (Type[])null, (Type[])null), (object)null, true); internal static Coroutine _activeCoroutine; private static bool Prefix() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 if (!BiomeManager.IsPrimary || BiomeManager.BiomeData.Count == 0) { return true; } if ((int)SystemInfo.graphicsDeviceType == 4) { return false; } if ((Object)(object)Player.m_localPlayer == (Object)null) { return false; } if (_activeCoroutine != null) { ((MonoBehaviour)BiomeManager.Runner).StopCoroutine(_activeCoroutine); } _activeCoroutine = ((MonoBehaviour)BiomeManager.Runner).StartCoroutine(GenerateAsync(Minimap.instance)); return false; } [IteratorStateMachine(typeof(d__8))] internal static IEnumerator GenerateAsync(Minimap instance) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__8(0) { instance = instance }; } } [HarmonyPatch(typeof(Player), "OnSpawned")] internal static class Patch_Player_OnSpawned { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] private static void Postfix(Player __instance) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Invalid comparison between Unknown and I4 if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return; } if (BiomeManager._playerSpawnTime < 0f) { BiomeManager._playerSpawnTime = Time.time; } if (!BiomeManager.IsPrimary || BiomeManager.BiomeData.Count == 0) { return; } if ((Object)(object)Minimap.instance == (Object)null) { ZLog.LogWarning((object)"[BiomeManager] OnSpawned: Minimap.instance é null!"); } else if ((int)SystemInfo.graphicsDeviceType != 4) { if (Patch_GenerateWorldMap_Async._activeCoroutine != null) { ((MonoBehaviour)BiomeManager.Runner).StopCoroutine(Patch_GenerateWorldMap_Async._activeCoroutine); } Patch_GenerateWorldMap_Async._activeCoroutine = ((MonoBehaviour)BiomeManager.Runner).StartCoroutine(Patch_GenerateWorldMap_Async.GenerateAsync(Minimap.instance)); } } } [HarmonyPatch(typeof(WorldGenerator), "Initialize")] internal static class Patch_Initialize { private static void Prefix() { if (BiomeManager.IsPrimary) { BiomeManager.Offsets.Clear(); } } } [HarmonyPatch(typeof(WorldGenerator), "Pregenerate")] [HarmonyPriority(500)] internal static class Patch_Pregenerate_ClearCache { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] private static void Prefix(WorldGenerator __instance) { //IL_0052: 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) if (BiomeManager.IsPrimary) { __instance.m_riverCacheLock.EnterWriteLock(); __instance.m_riverPoints = new Dictionary(); __instance.m_rivers = new List(); __instance.m_streams = new List(); __instance.m_lakes = new List(); __instance.m_cachedRiverGrid = new Vector2i(-999999, -999999); __instance.m_cachedRiverPoints = (RiverPoint[])(object)new RiverPoint[0]; __instance.m_riverCacheLock.ExitWriteLock(); } } } [HarmonyPatch(typeof(WorldGenerator), "Pregenerate")] [HarmonyPriority(700)] internal static class Patch_Pregenerate_Offsets { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] private static void Prefix(WorldGenerator __instance) { //IL_0025: 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) //IL_0051: 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_005d: 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) if (!BiomeManager.IsPrimary || BiomeManager.Offsets.Count > 0) { return; } State state = Random.state; Random.InitState(__instance.m_world.m_seed); foreach (Biome key in BiomeManager.BiomeData.Keys) { BiomeManager.Offsets[key] = Random.Range(-10000f, 10000f); } Random.state = state; } } [HarmonyPatch(typeof(WorldGenerator), "GetBiome", new Type[] { typeof(float), typeof(float), typeof(float), typeof(bool) })] internal static class Patch_GetBiome { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] private static bool Prefix(WorldGenerator __instance, float wx, float wy, float oceanLevel, bool waterAlwaysOcean, ref Biome __result) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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_002f: Invalid comparison between Unknown and I4 //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected I4, but got Unknown if (!BiomeManager.IsPrimary) { return true; } if (__instance.m_world.m_menu) { return true; } Biome biomeAt = BiomeManager.GetBiomeAt(__instance, wx, wy); if ((int)biomeAt == 0) { return true; } if (waterAlwaysOcean && __instance.GetHeight(wx, wy) <= oceanLevel) { __result = (Biome)256; return false; } __result = (Biome)(int)biomeAt; return false; } } [HarmonyPatch(typeof(WorldGenerator), "GetForestFactor")] internal static class Patch_GetForestFactor { private static void Postfix(Vector3 pos, ref float __result) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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_0037: 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) if (!BiomeManager.IsPrimary || WorldGenerator.instance == null) { return; } Biome biome = WorldGenerator.instance.GetBiome(pos); float num = 1f; if (BiomeManager.TryGetData(biome, out var data)) { num = data.ForestMultiplier; } else { if (!BiomeManager.VanillaBiomeForestMultipliers.TryGetValue(biome, out var value)) { return; } num = value; } num = Mathf.Max(0f, num); if (!(num <= 0f)) { __result = Mathf.Max(0f, __result - (num - 1f) * 0.5f); } } } [HarmonyPatch(typeof(WorldGenerator), "GetBiomeHeight")] [Nullable(0)] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] internal static class Patch_GetBiomeHeight { private static void Prefix(WorldGenerator __instance, ref Biome biome, ref Biome __state) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected I4, but got Unknown if (BiomeManager.IsPrimary && !__instance.m_world.m_menu) { __state = biome; biome = (Biome)(int)BiomeManager.GetTerrain(biome); } } private static void Postfix(WorldGenerator __instance, Biome __state, Biome biome, float wx, float wy, ref Color mask, ref float __result) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) if (BiomeManager.IsPrimary && !__instance.m_world.m_menu && BiomeManager.TryGetData(__state, out var data)) { float num = Mathf.Sign(data.ExcessFactor); float num2 = Mathf.Abs(data.ExcessFactor); __result -= WorldInfo.WaterLevel; __result *= data.AltitudeMultiplier; __result += data.AltitudeDelta; if (__result < 0f) { __result *= data.WaterDepthMultiplier; } if (__result > data.MaximumAltitude) { __result = data.MaximumAltitude + num * Mathf.Pow(__result - data.MaximumAltitude, num2); } if (__result < data.MinimumAltitude) { __result = data.MinimumAltitude - num * Mathf.Pow(data.MinimumAltitude - __result, num2); } __result += WorldInfo.WaterLevel; } } } [HarmonyPatch(typeof(Heightmap), "GetBiomeColor", new Type[] { typeof(Biome) })] internal static class Patch_GetBiomeColor { private static bool Prefix(Biome biome, ref Color32 __result) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (!BiomeManager.IsPrimary) { return true; } if (!BiomeManager.TryGetData(biome, out var data)) { return true; } if (data.TerrainColor.a == 0f) { return true; } __result = Color32.op_Implicit(data.TerrainColor); return false; } } [HarmonyPatch(typeof(Minimap), "GetPixelColor")] internal static class Patch_GetPixelColor { private static bool Prefix(Biome biome, ref Color __result) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) if (!BiomeManager.IsPrimary) { return true; } if (!BiomeManager.TryGetData(biome, out var data)) { return true; } if (data.MapColor.a == 0f) { return true; } __result = data.MapColor; return false; } } [HarmonyPatch(typeof(Minimap), "GetMaskColor")] internal static class Patch_GetMaskColor { private static void Prefix(ref Biome biome) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected I4, but got Unknown if (BiomeManager.IsPrimary) { biome = (Biome)(int)BiomeManager.GetTerrain(biome); } } } [HarmonyPatch(typeof(Heightmap), "GetBiome")] internal static class Patch_GetBiomeHM { internal static bool UseNature; private static Biome Postfix(Biome biome) { //IL_000f: 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_0012: 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_001b: Unknown result type (might be due to invalid IL or missing references) return (BiomeManager.IsPrimary && UseNature) ? BiomeManager.GetNature(biome) : biome; } } [HarmonyPatch(typeof(Heightmap), "FindBiome")] internal static class Patch_FindBiome { private static Biome Postfix(Biome biome) { //IL_000f: 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_0012: 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_001b: Unknown result type (might be due to invalid IL or missing references) return (BiomeManager.IsPrimary && Patch_GetBiomeHM.UseNature) ? BiomeManager.GetNature(biome) : biome; } } [HarmonyPatch(typeof(Plant), "UpdateHealth")] internal static class Patch_PlantNature { private static void Prefix() { if (BiomeManager.IsPrimary) { Patch_GetBiomeHM.UseNature = true; } } private static void Finalizer() { Patch_GetBiomeHM.UseNature = false; } } [HarmonyPatch(typeof(Beehive), "CheckBiome")] internal static class Patch_BeehiveNature { private static void Prefix() { if (BiomeManager.IsPrimary) { Patch_GetBiomeHM.UseNature = true; } } private static void Finalizer() { Patch_GetBiomeHM.UseNature = false; } } [HarmonyPatch(typeof(Player), "UpdatePlacementGhost")] internal static class Patch_PlacementNature { private static void Prefix() { if (BiomeManager.IsPrimary) { Patch_GetBiomeHM.UseNature = true; } } private static void Finalizer() { Patch_GetBiomeHM.UseNature = false; } } [HarmonyPatch(typeof(Localization), "Translate")] internal static class Patch_Translate { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] private static void Postfix(string word, ref string __result) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (BiomeManager.IsPrimary && !string.IsNullOrEmpty(word) && word.StartsWith("biome_")) { string key = word.Substring(6); if (BiomeManager.NameToEnum.TryGetValue(key, out var value) && BiomeManager.TryGetData(value, out var data)) { __result = data.DisplayName; } } } } [Nullable(0)] [HarmonyPatch] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] internal static class Patch_TryParseBiome { private static IEnumerable TargetMethods() { return (from method in (from method in typeof(Enum).GetMethods() where method.Name == "TryParse" select method).Take(2) select method.MakeGenericMethod(typeof(Biome))).Cast(); } private static bool Prefix(string value, ref Biome result, ref bool __result) { if (!BiomeManager.IsPrimary) { return true; } __result = BiomeManager.TryGetBiome(value, out result); return false; } } [HarmonyPatch(typeof(Enum), "GetName")] internal static class Patch_GetName { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] private static bool Prefix(Type enumType, object value, ref string __result) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (!BiomeManager.IsPrimary) { return true; } if (enumType == typeof(Biome)) { if (BiomeManager.EnumToName.TryGetValue((Biome)value, out var value2)) { __result = value2; } else { __result = "None"; } return false; } return true; } } [HarmonyPatch(typeof(Enum), "Parse", new Type[] { typeof(Type), typeof(string) })] internal static class Patch_EnumParse { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] private static bool Prefix(Type enumType, string value, ref object __result) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) if (!BiomeManager.IsPrimary) { return true; } if (enumType == typeof(Biome) && BiomeManager.TryGetBiome(value, out var b)) { __result = b; return false; } return true; } } internal class BiomeManagerRunner : MonoBehaviour { private bool _scheduled = false; public void ScheduleRegenerate() { if (!_scheduled) { _scheduled = true; ((MonoBehaviour)this).Invoke("DoRegenerate", 1f); } } private void DoRegenerate() { _scheduled = false; BiomeManager.AutomaticRegenerate(); } } } namespace DeepNorthGlitnir { [Nullable(0)] [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] [BepInPlugin("wesley.DeepNorthGlitnir", "DeepNorthGlitnir", "0.2.4")] public class DeepNorthGlitnirPlugin : BaseUnityPlugin { [HarmonyPatch(typeof(Player), "Update")] [Nullable(0)] public static class Player_RPGIndicatorPatch { private static GameObject rpgIndicator; private static ZNetView rpgNetView; public static void Postfix(Player __instance) { //IL_009b: Unknown result type (might be due to invalid IL or missing references) if (!((Character)__instance).IsOwner()) { return; } if (ZInput.GetKey((KeyCode)304, true) && ZInput.GetKey((KeyCode)114, true) && ZInput.GetKeyDown((KeyCode)112, true) && (Object)(object)rpgIndicator == (Object)null) { GameObject prefab = ZNetScene.instance.GetPrefab("glitnir_rp"); if ((Object)(object)prefab != (Object)null) { rpgIndicator = Object.Instantiate(prefab, ((Component)__instance).transform); rpgIndicator.transform.localPosition = new Vector3(0f, 2.5f, 0.1f); rpgNetView = rpgIndicator.GetComponent(); if ((Object)(object)rpgNetView != (Object)null && !rpgNetView.IsValid()) { rpgNetView = null; Object.Destroy((Object)(object)rpgIndicator); rpgIndicator = null; } } } if (ZInput.GetKey((KeyCode)306, true) && ZInput.GetKey((KeyCode)114, true) && ZInput.GetKeyDown((KeyCode)112, true) && (Object)(object)rpgIndicator != (Object)null && (Object)(object)rpgNetView != (Object)null) { if (rpgNetView.IsValid()) { ZNetScene.instance.Destroy(rpgIndicator); } else { Object.Destroy((Object)(object)rpgIndicator); } rpgIndicator = null; rpgNetView = null; } } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] [HarmonyPatch(typeof(ZNetScene), "Awake")] private static class DeepNorthZNetScene_AwakePost_Patch { [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(1)] private static void Postfix(ZNetScene __instance) { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Expected O, but got Unknown //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Expected O, but got Unknown if ((Object)(object)__instance == (Object)null) { return; } List prefabs = __instance.m_prefabs; if (prefabs == null || prefabs.Count <= 0) { return; } CookingStation component = __instance.GetPrefab("piece_cookingstation").GetComponent(); CookingStation component2 = __instance.GetPrefab("piece_cookingstation_iron").GetComponent(); CookingStation component3 = __instance.GetPrefab("piece_oven").GetComponent(); foreach (KeyValuePair item in dng_fogueira) { component.m_conversion.Add(new ItemConversion { m_cookTime = 30f, m_from = __instance.GetPrefab(((Object)item.Key).name).GetComponent(), m_to = __instance.GetPrefab(((Object)item.Value).name).GetComponent() }); component2.m_conversion.Add(new ItemConversion { m_cookTime = 30f, m_from = __instance.GetPrefab(((Object)item.Key).name).GetComponent(), m_to = __instance.GetPrefab(((Object)item.Value).name).GetComponent() }); } foreach (KeyValuePair item2 in dng_forno) { component3.m_conversion.Add(new ItemConversion { m_cookTime = 30f, m_from = __instance.GetPrefab(((Object)item2.Key).name).GetComponent(), m_to = __instance.GetPrefab(((Object)item2.Value).name).GetComponent() }); } } } [<0c327753-e838-4ea4-bdf4-e87e7309ce6f>NullableContext(0)] private class ConfigurationManagerAttributes { public bool? Browsable = false; } internal const string ModName = "DeepNorthGlitnir"; internal const string ModVersion = "0.2.4"; internal const string Author = "wesley"; private const string ModGUID = "wesley.DeepNorthGlitnir"; private static string ConfigFileName = "wesley.DeepNorthGlitnir.cfg"; private static string ConfigFileFullPath; private readonly Harmony _harmony = new Harmony("wesley.DeepNorthGlitnir"); private static Dictionary dng_fogueira; private static Dictionary dng_forno; public static readonly ManualLogSource DeepNorthGlitnirLogger; private static readonly ConfigSync ConfigSync; [Nullable(2)] private static ConfigEntry _serverConfigLocked; public void Start() { Upgrade.Register("glitnir", "Adds DeepNorth Glitnir to already explored areas.", "locations_add SjarLocation, DeepNorth_Dungeon, Glitnir_Spawner_GoldVein, Glitnir_Spawner_Vikings, RuinsVikings01, RuinsVikings02, RuinsVikings03 start"); Upgrade.Register("glitnirremove", "Adds DeepNorth Glitnir to already explored areas.", "locations_remove SjarLocation, DeepNorth_Dungeon, Glitnir_Spawner_GoldVein, Glitnir_Spawner_Vikings, RuinsVikings01, RuinsVikings02, RuinsVikings03 start"); } public void Awake() { //IL_04ac: Unknown result type (might be due to invalid IL or missing references) //IL_04b3: Unknown result type (might be due to invalid IL or missing references) //IL_055b: Unknown result type (might be due to invalid IL or missing references) //IL_0562: Unknown result type (might be due to invalid IL or missing references) //IL_060b: Unknown result type (might be due to invalid IL or missing references) //IL_0612: Unknown result type (might be due to invalid IL or missing references) //IL_06b0: Unknown result type (might be due to invalid IL or missing references) //IL_06b7: Unknown result type (might be due to invalid IL or missing references) //IL_0755: Unknown result type (might be due to invalid IL or missing references) //IL_075c: Unknown result type (might be due to invalid IL or missing references) //IL_07fe: Unknown result type (might be due to invalid IL or missing references) //IL_0805: Unknown result type (might be due to invalid IL or missing references) //IL_08a7: Unknown result type (might be due to invalid IL or missing references) //IL_08ae: Unknown result type (might be due to invalid IL or missing references) global::BiomeManager.BiomeManager.ForVanillaBiome((Biome)64).SetForestMultiplier(1.5f).AddVegetation("Pickable_Glitnir_IceFungus01", enabled: true, 2f, 2f, 1f, 1f, 0f, BiomeArea.Everything, forcePlacement: false, 1f, 1000f, 0f, 25f, 2f, 1f, 1.2f, 1, 2, 25f, inForest: true) .AddVegetation("Pickable_Glitnir_IceFungus02", enabled: true, 2f, 2f, 1f, 1f, 0f, BiomeArea.Everything, forcePlacement: false, 1f, 1000f, 0f, 25f, 2f, 1f, 1.2f, 1, 2, 25f, inForest: true) .AddVegetation("Pickable_Glitnir_IceFungus03", enabled: true, 2f, 2f, 1f, 1f, 0f, BiomeArea.Everything, forcePlacement: false, 1f, 1000f, 0f, 40f, 2f, 1f, 1.2f, 1, 4, 25f, inForest: true) .AddVegetation("IceBush01", enabled: true, 20f, 30f, 0.8f, 1.5f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 25f, 10f, 0f, 2.25f) .AddVegetation("IceBush02", enabled: true, 20f, 30f, 0.8f, 1.5f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 25f, 10f, 0f, 2.25f) .AddVegetation("IceBush03", enabled: true, 20f, 30f, 0.8f, 1.5f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 25f, 10f, 0f, 2.25f) .AddVegetation("Pinus01", enabled: true, 4f, 8f, 0.8f, 1.5f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 20f, 10f, 0f, 2.25f, 1, 1, 0f, inForest: true) .AddVegetation("Pinus02", enabled: true, 4f, 8f, 0.8f, 1.5f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 35f, 10f, 0f, 2.25f, 1, 1, 0f, inForest: true) .AddVegetation("Pinus03", enabled: true, 4f, 8f, 0.8f, 1.5f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 35f, 10f, 0f, 2.25f, 1, 1, 0f, inForest: true) .AddVegetation("Pinus04", enabled: true, 4f, 8f, 0.8f, 1.5f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 20f, 10f, 0f, 2.25f, 1, 1, 0f, inForest: true) .AddVegetation("MineRock_DeepNorth_01", enabled: true, 2f, 2f, 0.9f, 1.4f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 35f, 10f, 0f, 2.25f, 1, 3, 12f) .AddVegetation("MineRock_DeepNorth_02", enabled: true, 2f, 2f, 0.9f, 1.4f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 35f, 10f, 0f, 2.25f, 1, 3, 12f) .AddVegetation("MineRock_DeepNorth_03", enabled: true, 2f, 2f, 0.9f, 1.4f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 35f, 10f, 0f, 2.25f, 1, 3, 12f) .AddVegetation("MineRock_DeepNorth_04", enabled: true, 2f, 2f, 0.9f, 1.4f, 4f, BiomeArea.Everything, forcePlacement: true, 0.1f, 1000f, 2f, 35f, 10f, 0f, 2.25f, 1, 3, 12f); Location location = new Location("mar_deepnorth_glitnir", "SjarLocation") { MapIcon = "IcoNumber04.png", ShowMapIcon = ShowIcon.Never, Biome = (Biome)64, SpawnArea = (BiomeArea)3, Rotation = Rotation.Random, SnapToWater = false, GroupName = "Forseti", Prioritize = true, ClearArea = true, SpawnDistance = new LocationManager.Range(5500f, 40000f), SpawnAltitude = new LocationManager.Range(1f, 1000f), MinimumDistanceFromGroup = 500f, CanSpawn = true, Count = 8, Unique = false }; Location location2 = new Location("mar_deepnorth_glitnir", "DeepNorth_Dungeon") { MapIcon = "IcoNumber06.png", ShowMapIcon = ShowIcon.Never, Biome = (Biome)64, SpawnArea = (BiomeArea)3, Rotation = Rotation.Random, SnapToWater = false, GroupName = "GlitnirDungeon", Prioritize = true, ClearArea = true, SpawnDistance = new LocationManager.Range(5500f, 40000f), SpawnAltitude = new LocationManager.Range(1f, 1000f), MinimumDistanceFromGroup = 500f, CanSpawn = true, Count = 80, Unique = false }; Location location3 = new Location("mar_deepnorth_glitnir", "Glitnir_Spawner_GoldVein") { MapIcon = "IcoNumber09.png", ShowMapIcon = ShowIcon.Never, Biome = (Biome)64, SpawnArea = (BiomeArea)3, Rotation = Rotation.Random, SnapToWater = false, GroupName = "GoldVein", SpawnDistance = new LocationManager.Range(5500f, 40000f), SpawnAltitude = new LocationManager.Range(1f, 1000f), MinimumDistanceFromGroup = 50f, CanSpawn = true, Count = 200, Unique = false }; Location location4 = new Location("mar_deepnorth_glitnir", "Glitnir_Spawner_Vikings") { MapIcon = "IcoNumber05.png", ShowMapIcon = ShowIcon.Never, Biome = (Biome)64, SpawnArea = (BiomeArea)3, Rotation = Rotation.Random, SnapToWater = false, GroupName = "Vikings", SpawnDistance = new LocationManager.Range(5500f, 40000f), SpawnAltitude = new LocationManager.Range(1f, 1000f), MinimumDistanceFromGroup = 150f, CanSpawn = true, Count = 500, Unique = false }; Location location5 = new Location("mar_deepnorth_glitnir", "RuinsVikings01") { MapIcon = "IcoNumber01.png", ShowMapIcon = ShowIcon.Never, Biome = (Biome)64, SpawnArea = (BiomeArea)3, Rotation = Rotation.Random, SnapToWater = false, GroupName = "Ruins", ClearArea = true, SpawnDistance = new LocationManager.Range(5500f, 40000f), SpawnAltitude = new LocationManager.Range(1f, 1000f), MinimumDistanceFromGroup = 100f, CanSpawn = true, Count = 120, Unique = false }; Location location6 = new Location("mar_deepnorth_glitnir", "RuinsVikings02") { MapIcon = "IcoNumber02.png", ShowMapIcon = ShowIcon.Never, Biome = (Biome)64, SpawnArea = (BiomeArea)3, Rotation = Rotation.Random, SnapToWater = false, GroupName = "Ruins", ClearArea = true, SpawnDistance = new LocationManager.Range(5500f, 40000f), SpawnAltitude = new LocationManager.Range(1f, 1000f), MinimumDistanceFromGroup = 100f, CanSpawn = true, Count = 120, Unique = false }; Location location7 = new Location("mar_deepnorth_glitnir", "RuinsVikings03") { MapIcon = "IcoNumber03.png", ShowMapIcon = ShowIcon.Never, Biome = (Biome)64, SpawnArea = (BiomeArea)3, Rotation = Rotation.Random, SnapToWater = false, GroupName = "Ruins", ClearArea = true, SpawnDistance = new LocationManager.Range(5500f, 40000f), SpawnAltitude = new LocationManager.Range(1f, 1000f), MinimumDistanceFromGroup = 100f, CanSpawn = true, Count = 120, Unique = false }; GameObject val = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "InteriorEnvironmentGlitnirCave"); Creature creature = new Creature("mar_deepnorth_glitnir", "Glitnir_Wyrm_Ice").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureSpawnAltitude(10f) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 3f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature.Localize().Portuguese_Brazilian("Wyrm do gelo").English("Snow Wyrm"); creature.ConfigureDrops(); creature.Drops["Glitnir_WyrmWing"].Amount = new CreatureManager.Range(1f, 1f); creature.Drops["Glitnir_WyrmWing"].DropChance = 100f; creature.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature.Drops["FrozenCore_Glitnir"].DropChance = 5f; Creature creature2 = new Creature("mar_deepnorth_glitnir", "Glitnir_Wyrm_Magic").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureSpawnAltitude(10f) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 3f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature2.Localize().Portuguese_Brazilian("Wyrm Gelado").English("Frozen Wyrm"); creature2.ConfigureDrops(); creature2.Drops["Glitnir_WyrmWing"].Amount = new CreatureManager.Range(1f, 1f); creature2.Drops["Glitnir_WyrmWing"].DropChance = 100f; creature2.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature2.Drops["FrozenCore_Glitnir"].DropChance = 5f; GameObject val2 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "wyrm_cold_projectile_dnglitnir"); GameObject val3 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_Hit_SpellBlue_dnglitnir"); GameObject val4 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_wyrm_hurt_dnglitnir"); GameObject val5 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wyrm_attack_dnglitnir"); GameObject val6 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wyrm_hurt_dnglitnir"); GameObject val7 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wyrm_idle_dnglitnir"); GameObject val8 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_hatchling_death_dnglitnir"); GameObject val9 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wyrm_attack_hit"); GameObject val10 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wyrm_coldball_explode"); GameObject val11 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wyrm_coldball_launch"); GameObject val12 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wyrm_coldball_start"); GameObject val13 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_ColdBall_launch_dnglitnir"); Item item = new Item("mar_deepnorth_glitnir", "Glitnir_WyrmWing"); item.Name.English("Wyrm Wing"); item.Description.English("Wyrm Wing"); item.Name.Portuguese_Brazilian("Asa de Wyrm"); item.Description.Portuguese_Brazilian("Asa de Wyrm"); item.Configurable = Configurability.Disabled; Item item2 = new Item("mar_deepnorth_glitnir", "wyrm_spitcold_attack_dnglitnir"); item2.Name.English("Wyrm Attack"); item2.Description.English("Wyrm Attack"); item2.Configurable = Configurability.Stats; Creature creature3 = new Creature("mar_deepnorth_glitnir", "Glitnir_Wolf").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 3f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature3.Localize().Portuguese_Brazilian("Lobo Glitnir").English("Glitnir Wolf"); creature3.ConfigureDrops(); creature3.Drops["GlitnirWolf_Pelt"].Amount = new CreatureManager.Range(1f, 1f); creature3.Drops["GlitnirWolf_Pelt"].DropChance = 100f; creature3.Drops["GlitnirWolf_Raw"].Amount = new CreatureManager.Range(1f, 1f); creature3.Drops["GlitnirWolf_Raw"].DropChance = 100f; creature3.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature3.Drops["FrozenCore_Glitnir"].DropChance = 5f; Creature creature4 = new Creature("mar_deepnorth_glitnir", "Sjar_Wolf").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 3f)) .ConfigureMaximum(80) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning(enabled: false) .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature4.Localize().Portuguese_Brazilian("Lobo do Sjar").English("Sjar's Wolf"); Creature creature5 = new Creature("mar_deepnorth_glitnir", "Glitnir_WolfCub").EnableStars().EnableSpawning(enabled: false).ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature5.Localize().Portuguese_Brazilian("Filhote de Lobo").English("Wolf Cub"); GameObject val14 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Glitnir_WolfRAG"); GameObject val15 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Sjar_WolfRAG"); GameObject val16 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Glitnir_WolfCubRAG"); GameObject val17 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_alerted_glitnirwolf"); GameObject val18 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_attack1_glitnirwolf"); GameObject val19 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_attack2_glitnirwolf"); GameObject val20 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_attack_hit_glitnirwolf"); GameObject val21 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_birth_glitnirwolf"); GameObject val22 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_bocejando_glitnirwolf"); GameObject val23 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_cavando_glitnirwolf"); GameObject val24 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_cheirando_glitnirwolf"); GameObject val25 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_consume_glitnirwolf"); GameObject val26 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_coçando_glitnirwolf"); GameObject val27 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_death_glitnirwolf"); GameObject val28 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_haul_glitnirwolf"); GameObject val29 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_hit_glitnirwolf"); GameObject val30 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_love_glitnirwolf"); GameObject val31 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_uivando_glitnirwolf"); GameObject val32 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_hit_glitnirwolf"); GameObject val33 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_death_glitnirwolf"); Item item3 = new Item("mar_deepnorth_glitnir", "GlitnirWolf_Raw"); item3.Name.English("Glitnir Wolf Meat"); item3.Description.English("Glitnir Wolf Meat"); item3.Name.Portuguese_Brazilian("Carne de lobo"); item3.Description.Portuguese_Brazilian("Carne de lobo da neve"); item3.Configurable = Configurability.Disabled; Item item4 = new Item("mar_deepnorth_glitnir", "GlitnirWolf_Pelt"); item4.Name.English("Glitnir Wolf Pelt"); item4.Description.English("Glitnir Wolf Pelt"); item4.Name.Portuguese_Brazilian("Pele de lobo"); item4.Description.Portuguese_Brazilian("Pele de lobo da neve"); item4.Configurable = Configurability.Disabled; Item item5 = new Item("mar_deepnorth_glitnir", "GlitnirWolfMeat_cooked"); item5.Name.English("Glitnir Wolf Meat Cooked"); item5.Description.English("Glitnir Wolf Cooked"); item5.Name.Portuguese_Brazilian("Carne de lobo assada"); item5.Description.Portuguese_Brazilian("Carne de lobo da neve assada"); item5.Configurable = Configurability.Disabled; Item item6 = new Item("mar_deepnorth_glitnir", "Attack1_glitnirwolf"); item6.Name.English("Glitnir Wolf Attack1"); item6.Description.English("Glitnir Wolf Attack1"); item6.Configurable = Configurability.Stats; Item item7 = new Item("mar_deepnorth_glitnir", "Attack2_glitnirwolf"); item7.Name.English("Glitnir Wolf Attack2"); item7.Description.English("Glitnir Wolf Attack2"); item7.Configurable = Configurability.Stats; Item item8 = new Item("mar_deepnorth_glitnir", "Attack3_glitnirwolf"); item8.Name.English("Glitnir Wolf Attack3"); item8.Description.English("Glitnir Wolf Attack3"); item8.Configurable = Configurability.Stats; dng_fogueira.Add(item3.Prefab, item5.Prefab); Creature creature6 = new Creature("mar_deepnorth_glitnir", "Glitnir_Rostrokarck_Queen").EnableStars().EnableTaming(enabled: false, isConfigurable: false).EnableSpawning(enabled: false) .ConfigureHealth(40000f) .ConfigureRegenAllHpTime(3600f); creature6.Localize().Portuguese_Brazilian("Rainha Rostrokarck").English("Rostrokarck Queen"); creature6.ConfigureDrops(); creature6.Drops["Coins"].Amount = new CreatureManager.Range(100f, 200f); creature6.Drops["Coins"].DropChance = 100f; creature6.Drops["SjarBookGear"].Amount = new CreatureManager.Range(1f, 1f); creature6.Drops["SjarBookGear"].DropChance = 100f; GameObject val34 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Glitnir_Rostrokarck_QueenRAG"); GameObject val35 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "queen_poisonball_projectile"); GameObject val36 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_queenpoison_attack_hit"); GameObject val37 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_PoisonBall_launch_dnglitnir"); Item item9 = new Item("mar_deepnorth_glitnir", "Attack_Rostrokarck01"); item9.Name.English("Rostrokarck Attack1"); item9.Description.English("Rostrokarck Attack1"); item9.Configurable = Configurability.Stats; Item item10 = new Item("mar_deepnorth_glitnir", "Attack_Rostrokarck02"); item10.Name.English("Rostrokarck Attack2"); item10.Description.English("Rostrokarck Attack2"); item10.Configurable = Configurability.Stats; Item item11 = new Item("mar_deepnorth_glitnir", "Attack_Rostrokarck03"); item11.Name.English("Rostrokarck Attack3"); item11.Description.English("Rostrokarck Attack3"); item11.Configurable = Configurability.Stats; Item item12 = new Item("mar_deepnorth_glitnir", "Attack_Rostrokarck04"); item12.Name.English("Rostrokarck Attack4"); item12.Description.English("Rostrokarck Attack4"); item12.Configurable = Configurability.Stats; Item item13 = new Item("mar_deepnorth_glitnir", "Attack_Rostrokarck05"); item13.Name.English("Rostrokarck Attack5"); item13.Description.English("Rostrokarck Attack5"); item13.Configurable = Configurability.Stats; Creature creature7 = new Creature("mar_deepnorth_glitnir", "RostrokarckLarvae_Glitnir").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(2f, 5f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature7.Localize().Portuguese_Brazilian("Larva de Rostrokarck").English("Rostrokarck Larvae"); creature7.ConfigureDrops(); creature7.Drops["CaskLarvae"].Amount = new CreatureManager.Range(1f, 1f); creature7.Drops["CaskLarvae"].DropChance = 25f; GameObject val38 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "RostrokarckLarvaeRAG"); GameObject val39 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Vfx_OvoAbrindo"); GameObject val40 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_roarlarvae_glitnirwolf"); GameObject val41 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_larvae_hurt_dnglitnir"); GameObject val42 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_death_larvae"); GameObject val43 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_larvae_hurt"); GameObject val44 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_eggslarvae_open"); Item item14 = new Item("mar_deepnorth_glitnir", "CaskLarvae"); item14.Name.English("Rostrokarck Cask"); item14.Description.English("It gives a beautiful roast if prepared in the oven."); item14.Configurable = Configurability.Disabled; Item item15 = new Item("mar_deepnorth_glitnir", "Attack_RostrokarckLarvae01"); item15.Name.English("RostrokarckLarvae Attack1"); item15.Description.English("RostrokarckLarvae Attack1"); item15.Configurable = Configurability.Stats; Item item16 = new Item("mar_deepnorth_glitnir", "Attack_RostrokarckLarvae02"); item16.Name.English("RostrokarckLarvae Attack2"); item16.Description.English("RostrokarckLarvae Attack2"); item16.Configurable = Configurability.Stats; Creature creature8 = new Creature("mar_deepnorth_glitnir", "Glitnir_SnowScorpion").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 2f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature8.Localize().Portuguese_Brazilian("Escorpião do gelo").English("Snow Scorpion"); creature8.ConfigureDrops(); creature8.Drops["SnowScorpionTail"].Amount = new CreatureManager.Range(1f, 1f); creature8.Drops["SnowScorpionTail"].DropChance = 100f; creature8.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature8.Drops["FrozenCore_Glitnir"].DropChance = 5f; GameObject val45 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Glitnir_SnowScorpionRAG"); Item item17 = new Item("mar_deepnorth_glitnir", "SnowScorpionTail"); item17.Name.English("Scorpion Tail"); item17.Description.English("Scorpion Tail"); item17.Name.Portuguese_Brazilian("Cauda de escorpião"); item17.Description.Portuguese_Brazilian("Cauda de escorpião"); item17.Configurable = Configurability.Disabled; Item item18 = new Item("mar_deepnorth_glitnir", "Attack1_glitnirscorpion"); item18.Name.English("Scorpion Attack1"); item18.Description.English("Scorpion Attack1"); item18.Configurable = Configurability.Stats; Item item19 = new Item("mar_deepnorth_glitnir", "Attack2_glitnirscorpion"); item19.Name.English("Scorpion Attack2"); item19.Description.English("Scorpion Attack2"); item19.Configurable = Configurability.Stats; Item item20 = new Item("mar_deepnorth_glitnir", "Attack3_glitnirscorpion"); item20.Name.English("Scorpion Attack3"); item20.Description.English("Scorpion Attack3"); item20.Configurable = Configurability.Stats; Creature creature9 = new Creature("mar_deepnorth_glitnir", "Glitnir_SnowSpider").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(200f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature9.Localize().Portuguese_Brazilian("Aranha do gelo").English("Snow Spider"); creature9.ConfigureDrops(); creature9.Drops["GlitnirSpiderLegs"].Amount = new CreatureManager.Range(1f, 1f); creature9.Drops["GlitnirSpiderLegs"].DropChance = 100f; creature9.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature9.Drops["FrozenCore_Glitnir"].DropChance = 5f; GameObject val46 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Glitnir_SnowSpiderRAG"); GameObject val47 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "cavespider_projectile"); GameObject val48 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_poisonhit_ball_hit"); GameObject val49 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_teia_glitnir"); GameObject val50 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_spider_attack_spit"); GameObject val51 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_spider_web_launch"); Item item21 = new Item("mar_deepnorth_glitnir", "GlitnirSpiderLegs"); item21.Description.English("Spider Legs"); item21.Name.Portuguese_Brazilian("Perna de aranha"); item21.Description.Portuguese_Brazilian("Perna de aranha"); item21.Configurable = Configurability.Disabled; Item item22 = new Item("mar_deepnorth_glitnir", "Attack01_Cavespider"); item22.Name.English("Glitnir Snow Spider Attack1"); item22.Description.English("Glitnir Snow Spider Attack1"); item22.Configurable = Configurability.Stats; Item item23 = new Item("mar_deepnorth_glitnir", "Attack02_Cavespider"); item23.Name.English("Glitnir Snow Spider Attack2"); item23.Description.English("Glitnir Snow Spider Attack2"); item23.Configurable = Configurability.Stats; Item item24 = new Item("mar_deepnorth_glitnir", "Attack03_Cavespider"); item24.Name.English("Glitnir Snow Spider Attack3"); item24.Description.English("Glitnir Snow Spider Attack3"); item24.Configurable = Configurability.Stats; Creature creature10 = new Creature("mar_deepnorth_glitnir", "SjarSon_Archer01").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature10.Localize().Portuguese_Brazilian("Dag, Filho de Sjar").English("Dag, Sjar Son"); creature10.ConfigureDrops(); creature10.Drops["Coins"].Amount = new CreatureManager.Range(5f, 10f); creature10.Drops["Coins"].DropChance = 100f; creature10.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature10.Drops["FrozenCore_Glitnir"].DropChance = 5f; Creature creature11 = new Creature("mar_deepnorth_glitnir", "SjarSon_Archer02").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature11.Localize().Portuguese_Brazilian("Jarl, Filho de Sjar").English("Jarl, Sjar Son"); creature11.ConfigureDrops(); creature11.Drops["Coins"].Amount = new CreatureManager.Range(5f, 10f); creature11.Drops["Coins"].DropChance = 100f; creature11.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature11.Drops["FrozenCore_Glitnir"].DropChance = 5f; GameObject val52 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "SjarSon_Archer01RAG"); GameObject val53 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "SjarSon_Archer02RAG"); GameObject val54 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "bow_projectile_frost_dnglitnir"); Item item25 = new Item("mar_deepnorth_glitnir", "dng_vikingbow"); item25.Name.English("Sjar Son Bow"); item25.Description.English("Sjar Son Bow"); item25.Configurable = Configurability.Stats; Creature creature12 = new Creature("mar_deepnorth_glitnir", "SjarSon_Mace01").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature12.Localize().Portuguese_Brazilian("Leif, Filho de Sjar").English("Leif, Sjar Son"); creature12.ConfigureDrops(); creature12.Drops["Coins"].Amount = new CreatureManager.Range(5f, 10f); creature12.Drops["Coins"].DropChance = 100f; creature12.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature12.Drops["FrozenCore_Glitnir"].DropChance = 5f; Creature creature13 = new Creature("mar_deepnorth_glitnir", "SjarSon_Mace02").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature13.Localize().Portuguese_Brazilian("Sten, Filho de Sjar").English("Sten, Sjar Son"); creature13.ConfigureDrops(); creature13.Drops["Coins"].Amount = new CreatureManager.Range(5f, 10f); creature13.Drops["Coins"].DropChance = 100f; creature13.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature13.Drops["FrozenCore_Glitnir"].DropChance = 5f; GameObject val55 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "SjarSon_Mace01RAG"); GameObject val56 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "SjarSon_Mace02RAG"); Item item26 = new Item("mar_deepnorth_glitnir", "dng_vikingmace_atk01"); item26.Name.English("Sjar Son Mace"); item26.Description.English("Sjar Son Mace"); item26.Configurable = Configurability.Stats; Item item27 = new Item("mar_deepnorth_glitnir", "dng_vikingmace_atk02"); item27.Name.English("Sjar Son Mace"); item27.Description.English("Sjar Son Mace"); item27.Configurable = Configurability.Stats; Item item28 = new Item("mar_deepnorth_glitnir", "dng_vikingmace_atk03"); item28.Name.English("Sjar Son Mace"); item28.Description.English("Sjar Son Mace"); item28.Configurable = Configurability.Stats; Item item29 = new Item("mar_deepnorth_glitnir", "dng_vikingmace_atk04"); item29.Name.English("Sjar Son Mace"); item29.Description.English("Sjar Son Mace"); item29.Configurable = Configurability.Stats; Item item30 = new Item("mar_deepnorth_glitnir", "dng_vikingmace_taunt"); item30.Name.English("Sjar Son Mace"); item30.Description.English("Sjar Son Mace"); item30.Configurable = Configurability.Stats; Creature creature14 = new Creature("mar_deepnorth_glitnir", "SjarSon_Sword01").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature14.Localize().Portuguese_Brazilian("Sven, Filho de Sjar").English("Sven, Sjar Son"); creature14.ConfigureDrops(); creature14.Drops["Coins"].Amount = new CreatureManager.Range(5f, 10f); creature14.Drops["Coins"].DropChance = 100f; creature14.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature14.Drops["FrozenCore_Glitnir"].DropChance = 5f; Creature creature15 = new Creature("mar_deepnorth_glitnir", "SjarSon_Sword02").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(80) .ConfigureSpawnDistance(100f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(15f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature15.Localize().Portuguese_Brazilian("Tore, Filho de Sjar").English("Tore, Sjar Son"); creature15.ConfigureDrops(); creature15.Drops["Coins"].Amount = new CreatureManager.Range(5f, 10f); creature15.Drops["Coins"].DropChance = 100f; creature15.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature15.Drops["FrozenCore_Glitnir"].DropChance = 5f; GameObject val57 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "SjarSon_Sword01RAG"); GameObject val58 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "SjarSon_Sword02RAG"); Item item31 = new Item("mar_deepnorth_glitnir", "dng_vikingsword_atk01"); item31.Name.English("Sjar Son Sword"); item31.Description.English("Sjar Son Sword"); item31.Configurable = Configurability.Stats; Item item32 = new Item("mar_deepnorth_glitnir", "dng_vikingsword_atk02"); item32.Name.English("Sjar Son Sword"); item32.Description.English("Sjar Son Sword"); item32.Configurable = Configurability.Stats; Item item33 = new Item("mar_deepnorth_glitnir", "dng_vikingsword_atk03"); item33.Name.English("Sjar Son Sword"); item33.Description.English("Sjar Son Sword"); item33.Configurable = Configurability.Stats; Item item34 = new Item("mar_deepnorth_glitnir", "dng_vikingsword_atk04"); item34.Name.English("Sjar Son Sword"); item34.Description.English("Sjar Son Sword"); item34.Configurable = Configurability.Stats; Item item35 = new Item("mar_deepnorth_glitnir", "dng_vikingsword_taunt"); item35.Name.English("Sjar Son Sword"); item35.Description.English("Sjar Son Sword"); item35.Configurable = Configurability.Stats; Creature creature16 = new Creature("mar_deepnorth_glitnir", "SnowTroll_Glitnir").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(50) .ConfigureSpawnDistance(250f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(2000) .ConfigureSpawnChance(20f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(8000f) .ConfigureRegenAllHpTime(3600f); creature16.Localize().Portuguese_Brazilian("Troll do Gelo").English("Snow Troll"); creature16.ConfigureDrops(); creature16.Drops["TrollLiver_Raw"].Amount = new CreatureManager.Range(1f, 1f); creature16.Drops["TrollLiver_Raw"].DropChance = 100f; creature16.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature16.Drops["FrozenCore_Glitnir"].DropChance = 5f; Creature creature17 = new Creature("mar_deepnorth_glitnir", "CaveTroll_Glitnir").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(50) .ConfigureSpawnDistance(250f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(2000) .ConfigureSpawnChance(20f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(4000f) .ConfigureRegenAllHpTime(3600f); creature17.Localize().Portuguese_Brazilian("Troll da Caverna").English("Cave Troll"); creature17.ConfigureDrops(); creature17.Drops["TrollLiver_Raw"].Amount = new CreatureManager.Range(1f, 1f); creature17.Drops["TrollLiver_Raw"].DropChance = 100f; creature17.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature17.Drops["FrozenCore_Glitnir"].DropChance = 5f; GameObject val59 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "CaveTroll_GlitnirRAG"); GameObject val60 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_snowtroll_alerted_dnglitnir"); GameObject val61 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_snowtroll_attack_hit_dnglitnir"); GameObject val62 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_snowtroll_attacking_dnglitnir"); GameObject val63 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_snowtroll_death_dnglitnir"); GameObject val64 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_snowtroll_hit_dnglitnir"); GameObject val65 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_snowtroll_idle_dnglitnir"); GameObject val66 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_snowtroll_rock_destroyed_dnglitnir"); GameObject val67 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_snowtroll_fart_dnglitnir"); GameObject val68 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_snowtroll_attack_hit_dnglitnir"); GameObject val69 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_snowtroll_death_dnglitnir"); GameObject val70 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_snowtroll_groundslam_dnglitnir"); GameObject val71 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_snowtroll_hit_dnglitnir"); GameObject val72 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_snowtroll_log_hitground_dnglitnir"); Item item36 = new Item("mar_deepnorth_glitnir", "SnowTroll_Atk01"); item36.Name.English("SnowTroll Attack1"); item36.Description.English("SnowTroll Attack1"); item36.Configurable = Configurability.Stats; Item item37 = new Item("mar_deepnorth_glitnir", "SnowTroll_Atk02"); item37.Name.English("SnowTroll Attack2"); item37.Description.English("SnowTroll SnowTroll Attack2"); item37.Configurable = Configurability.Stats; Item item38 = new Item("mar_deepnorth_glitnir", "SnowTroll_Atk03"); item38.Name.English("SnowTroll Attack3"); item38.Description.English("SnowTroll Attack3"); item38.Configurable = Configurability.Stats; Item item39 = new Item("mar_deepnorth_glitnir", "SnowTroll_Atk04"); item39.Name.English("SnowTroll Attack4"); item39.Description.English("SnowTroll Attack4"); item39.Configurable = Configurability.Stats; Item item40 = new Item("mar_deepnorth_glitnir", "SnowTroll_taunt"); item40.Name.English("SnowTroll Taunt"); item40.Description.English("SnowTroll Taunt"); item40.Configurable = Configurability.Disabled; Item item41 = new Item("mar_deepnorth_glitnir", "TrollLiver_Raw"); item41.Name.English("Troll Liver"); item41.Description.English("Troll Liver"); item41.Name.Portuguese_Brazilian("Fígado de Troll"); item41.Description.Portuguese_Brazilian("Fígado de Troll"); item41.Configurable = Configurability.Disabled; Item item42 = new Item("mar_deepnorth_glitnir", "TrollLiver_Cooked"); item42.Name.English("Troll Liver Cooked"); item42.Description.English("Troll Liver Cooked"); item42.Name.Portuguese_Brazilian("Fígado de Troll asssado"); item42.Description.Portuguese_Brazilian("Fígado de Troll assado"); item42.Configurable = Configurability.Stats; dng_fogueira.Add(item41.Prefab, item42.Prefab); Creature creature18 = new Creature("mar_deepnorth_glitnir", "WhiteShark_Glitnir").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(-1000f, 0f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(50) .ConfigureSpawnDistance(250f) .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1000) .ConfigureSpawnChance(10f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(40f) .ConfigureRegenAllHpTime(3600f); creature18.Localize().Portuguese_Brazilian("Tubarão Branco").English("White Shark"); creature18.ConfigureDrops(); creature18.Drops["SharkFin_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature18.Drops["SharkFin_Glitnir"].DropChance = 100f; GameObject val73 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_backstab_wsg"); GameObject val74 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_critcal_wsg"); GameObject val75 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_alert_whiteshark_wsg"); GameObject val76 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_attack_whiteshark_wsg"); GameObject val77 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_greatwhite_death_wsg"); GameObject val78 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_greatwhite_hit_wsg"); GameObject val79 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_greatwhite_death_wsg"); GameObject val80 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_HitSparks_wsg"); GameObject val81 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_wsurface_medium_wsg"); Item item43 = new Item("mar_deepnorth_glitnir", "WhiteShark_Attack_Bite1_wsg"); item43.Name.English("White Shark Attack1"); item43.Description.English("White Shark Attack1"); item43.Configurable = Configurability.Stats; Item item44 = new Item("mar_deepnorth_glitnir", "WhiteShark_Attack_Bite2_wsg"); item44.Name.English("White Shark Attack2"); item44.Description.English("White Shark Attack2"); item44.Configurable = Configurability.Stats; Item item45 = new Item("mar_deepnorth_glitnir", "WhiteShark_Attack_Bite3_wsg"); item45.Name.English("White Shark Attack3"); item45.Description.English("White Shark Attack3"); item45.Configurable = Configurability.Stats; Creature creature19 = new Creature("mar_deepnorth_glitnir", "Sjar").EnableStars().EnableTaming(enabled: false, isConfigurable: false).EnableSpawning(enabled: false) .ConfigureHealth(100000f) .ConfigureRegenAllHpTime(3600f); creature19.Localize().Portuguese_Brazilian("Sjar, o fodão.").English("Sjar, the Badass"); creature19.ConfigureDrops(); creature19.Drops["Glitnir_ForsetiBook"].Amount = new CreatureManager.Range(1f, 1f); creature19.Drops["Glitnir_ForsetiBook"].DropChance = 100f; creature19.Drops["Coins"].Amount = new CreatureManager.Range(500f, 600f); creature19.Drops["Coins"].DropChance = 100f; creature19.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(2f, 4f); creature19.Drops["FrozenCore_Glitnir"].DropChance = 10f; MaterialReplacer.RegisterGameObjectForShaderSwap(creature19.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item46 = new Item("mar_deepnorth_glitnir", "Attack_Sjar_IceRain"); item46.Name.English("Sjar Ice Rain"); item46.Description.English("Sjar Ice Rain"); item46.Configurable = Configurability.Stats; Item item47 = new Item("mar_deepnorth_glitnir", "Sjar_Attack01"); item47.Name.English("Sjar Attack 01"); item47.Description.English("Sjar Attack 01"); item47.Configurable = Configurability.Stats; Item item48 = new Item("mar_deepnorth_glitnir", "Sjar_Attack02"); item48.Name.English("Sjar Attack 02"); item48.Description.English("Sjar Attack 02"); item48.Configurable = Configurability.Stats; Item item49 = new Item("mar_deepnorth_glitnir", "Sjar_Attack03"); item49.Name.English("Sjar Attack 03"); item49.Description.English("Sjar Attack 03"); item49.Configurable = Configurability.Stats; Item item50 = new Item("mar_deepnorth_glitnir", "Sjar_Attack04"); item50.Name.English("Sjar Attack 04"); item50.Description.English("Sjar Attack 04"); item50.Configurable = Configurability.Stats; Item item51 = new Item("mar_deepnorth_glitnir", "Attack_Sjar_Wolfs"); item51.Name.English("Sjar Spawner"); item51.Description.English("Sjar Spawner"); item51.Configurable = Configurability.Stats; Item item52 = new Item("mar_deepnorth_glitnir", "GlitnirSjarBook"); item52.Name.English("Sjar Book"); item52.Name.Portuguese_Brazilian("Livro de Sjar"); item52.Description.English("Very valuable book because it tells the wisdom and power of Sjar."); item52.Description.Portuguese_Brazilian("Livro muito valioso por conter a sabedoria e poder de Sjar."); item52.Configurable = Configurability.Disabled; Item item53 = new Item("mar_deepnorth_glitnir", "SjarBookPage01"); item53.Name.English("Book Page One"); item53.Name.Portuguese_Brazilian("Página Um"); item53.Description.English("Lost page from the book of Sjar, used to summon the Sjar Boss in DeepNorth."); item53.Description.Portuguese_Brazilian("Página perdida do livro de Sjar, usada para invocar o Boss Sjar no Norte Profundo."); item53.Configurable = Configurability.Disabled; Item item54 = new Item("mar_deepnorth_glitnir", "SjarBookPage02"); item54.Name.English("Book Page Two"); item54.Name.Portuguese_Brazilian("Página Dois"); item54.Description.English("Lost page from the book of Sjar, used to summon the Sjar Boss in DeepNorth."); item54.Description.Portuguese_Brazilian("Página perdida do livro de Sjar, usada para invocar o Boss Sjar no Norte Profundo."); item54.Configurable = Configurability.Disabled; Item item55 = new Item("mar_deepnorth_glitnir", "SjarBookPage03"); item55.Name.English("Book Page Three"); item55.Name.Portuguese_Brazilian("Página Três"); item55.Description.English("Lost page from the book of Sjar, used to summon the Sjar Boss in DeepNorth."); item55.Description.Portuguese_Brazilian("Página perdida do livro de Sjar, usada para invocar o Boss Sjar no Norte Profundo."); item55.Configurable = Configurability.Disabled; Item item56 = new Item("mar_deepnorth_glitnir", "SjarBookPage04"); item56.Name.English("Book Page Four"); item56.Name.Portuguese_Brazilian("Página Quatro"); item56.Description.English("Lost page from the book of Sjar, used to summon the Forseti Boss in DeepNorth."); item56.Description.Portuguese_Brazilian("Página perdida do livro de Sjar, usada para invocar o Boss Forseti no Norte Profundo."); item56.Configurable = Configurability.Disabled; Item item57 = new Item("mar_deepnorth_glitnir", "SjarBookPage05"); item57.Name.English("Book Page Five"); item57.Name.Portuguese_Brazilian("Página Cinco"); item57.Description.English("Lost page from the book of Sjar, used to summon the Sjar Boss in DeepNorth."); item57.Description.Portuguese_Brazilian("Página perdida do livro de Sjar, usada para invocar o Boss Sjar no Norte Profundo."); item57.Configurable = Configurability.Disabled; Item item58 = new Item("mar_deepnorth_glitnir", "SjarBookPage06"); item58.Name.English("Book Page Six"); item58.Name.Portuguese_Brazilian("Página Seis"); item58.Description.English("Lost page from the book of Sjar, used to summon the Sjar Boss in DeepNorth."); item58.Description.Portuguese_Brazilian("Página perdida do livro de Sjar, usada para invocar o Boss Sjar no Norte Profundo."); item58.Configurable = Configurability.Disabled; Item item59 = new Item("mar_deepnorth_glitnir", "SjarBookPage07"); item59.Name.English("Book Page Seven"); item59.Name.Portuguese_Brazilian("Página Sete"); item59.Description.English("Lost page from the book of Sjar, used to summon the Forseti Boss in DeepNorth."); item59.Description.Portuguese_Brazilian("Página perdida do livro de Sjar, usada para invocar o Boss Forseti no Norte Profundo."); item59.Configurable = Configurability.Disabled; Item item60 = new Item("mar_deepnorth_glitnir", "SjarBookPage08"); item60.Name.English("Book Page Eight"); item60.Name.Portuguese_Brazilian("Página Oito"); item60.Description.English("Lost page from the book of Sjar, used to summon the Sjar Boss in DeepNorth."); item60.Description.Portuguese_Brazilian("Página perdida do livro de Sjar, usada para invocar o Boss Sjar no Norte Profundo."); item60.Configurable = Configurability.Disabled; Item item61 = new Item("mar_deepnorth_glitnir", "SjarBookGear"); item61.Name.English("Book Power Gear"); item61.Name.Portuguese_Brazilian("Engrenagem Mágica"); item61.Description.English("Power Gear Lost from the book of Sjar, used to summon the Sjar Boss in DeepNorth."); item61.Description.Portuguese_Brazilian("Engrenagem Mágica perdida do livro de Sjar, usada para invocar o Boss Sjar no Norte Profundo."); item61.Configurable = Configurability.Disabled; GameObject val82 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder"); GameObject val83 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder2"); GameObject val84 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder3"); GameObject val85 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder4"); GameObject val86 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder5"); GameObject val87 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder6"); GameObject val88 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder7"); GameObject val89 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder8"); GameObject val90 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjar_pageholder9"); GameObject val91 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "eventzone_sjar"); GameObject val92 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "spawn_wolfs"); GameObject val93 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_prespawn_sjarwolf"); GameObject val94 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "SjarRAG"); GameObject val95 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Vegvisir_Forseti"); GameObject val96 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_sjar_icerain_hit"); GameObject val97 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_sjar_icerain"); GameObject val98 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "projectile_icerain"); GameObject val99 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "spawn_icerain"); GameObject val100 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "staff_iceshard_projectile_glitnir"); GameObject val101 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_iceshard_hit_glitnir"); GameObject val102 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_iceshard_launch_glitnir"); GameObject val103 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_icestaff_start_glitnir"); GameObject val104 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Sjar_protect_aoe"); GameObject val105 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_SjarShield"); GameObject val106 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Sjar_Shield_Destroied"); GameObject val107 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_SjarShieldHit"); GameObject val108 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_alert_boss"); GameObject val109 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_attack03_glitnir"); GameObject val110 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_attack05_glitnir"); GameObject val111 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_death_boss"); GameObject val112 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_hurt_boss"); GameObject val113 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_sjar_spawn"); GameObject val114 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_prespawn_sjar"); GameObject val115 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_magic_circle"); GameObject val116 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_offering_sjar"); GameObject val117 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_pages_destroyed"); GameObject val118 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_forseti_bell"); GameObject val119 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_sjar_spawn_meteor_ambience_dng"); Creature creature20 = new Creature("mar_deepnorth_glitnir", "GiantWorm").ConfigureBiome((Biome)64).ConfigureForestSpawn(Forest.Both).ConfigureSpawnArea(SpawnArea.Everywhere) .ConfigureRequiredAltitude(new CreatureManager.Range(1f, 1000f)) .ConfigureRequiredOceanDepth(new CreatureManager.Range(0f, 0f)) .ConfigureRequiredWeather(Weather.None) .ConfigureRequiredGlobalKey(GlobalKey.None) .ConfigureGroupSize(new CreatureManager.Range(1f, 1f)) .ConfigureMaximum(50) .ConfigureAttackImmediately() .ConfigureSpawnTime(SpawnTime.Always) .ConfigureSpawnInterval(1500) .ConfigureSpawnChance(20f) .ConfigureSpawnDistance(200f) .EnableStars() .EnableTaming(enabled: false, isConfigurable: false) .EnableSpawning() .ConfigureHealth(1000f) .ConfigureRegenAllHpTime(3600f); creature20.Localize().Portuguese_Brazilian("Verme Gigante").English("Giant Worm"); creature20.ConfigureDrops(); creature20.Drops["Resin"].Amount = new CreatureManager.Range(1f, 1f); creature20.Drops["Resin"].DropChance = 100f; creature20.Drops["FrozenCore_Glitnir"].Amount = new CreatureManager.Range(1f, 1f); creature20.Drops["FrozenCore_Glitnir"].DropChance = 5f; Item item62 = new Item("mar_deepnorth_glitnir", "GiantWorm_Attack1"); item62.Name.English("GiantWorm Attack1"); item62.Description.English("GiantWorm Attack1"); item62.Configurable = Configurability.Stats; Item item63 = new Item("mar_deepnorth_glitnir", "GiantWorm_Attack2"); item63.Name.English("GiantWorm Attack2"); item63.Description.English("GiantWorm Attack2"); item63.Configurable = Configurability.Stats; GameObject val120 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "GiantWormRAG"); GameObject val121 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_giantworm_coldbreath"); GameObject val122 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_giantworm_pray"); GameObject val123 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_giantworm_attack1"); GameObject val124 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_giantworm_attack2"); GameObject val125 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_giantworm_alert"); GameObject val126 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_giantworm_cast"); GameObject val127 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_giantworm_death"); GameObject val128 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_giantworm_hit"); GameObject val129 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_giantworm_idle"); GameObject val130 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Glitnir_MineGold"); GameObject val131 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "GoldVein_Mine"); GameObject val132 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "GoldVein_Fracion"); Item item64 = new Item("mar_deepnorth_glitnir", "Glitnir_GoldOre"); item64.Name.English("Gold Ore"); item64.Description.English("Gold Ore"); item64.Name.Portuguese_Brazilian("Minério de ouro"); item64.Description.Portuguese_Brazilian("Minério de ouro"); item64.Configurable = Configurability.Disabled; Item item65 = new Item("mar_deepnorth_glitnir", "Glitnir_GoldBar"); item65.Name.English("Gold Bar"); item65.Description.English("Gold Bar"); item65.Name.Portuguese_Brazilian("Barra de ouro"); item65.Description.Portuguese_Brazilian("Barra de ouro"); item65.Configurable = Configurability.Disabled; new ItemManager.Conversion(item65) { Input = "Glitnir_GoldOre", Piece = ConversionPiece.BlastFurnace }; Item item66 = new Item("mar_deepnorth_glitnir", "PickaxeLava"); item66.Name.English("Pickaxe Lava"); item66.Name.Portuguese_Brazilian("Picareta de Lava"); item66.Description.English("Used for mining gold found in the Deep North."); item66.Description.Portuguese_Brazilian("Usada para mineração de ouro encontrado no DeepNorth"); item66.Crafting.Add(ItemManager.CraftingTable.BlackForge, 1); item66.RequiredItems.Add("SwordCheat", 1); item66.RequiredItems.Add("FineWood", 5); item66.RequiredUpgradeItems.Add("SwordCheat", 1); item66.RequiredUpgradeItems.Add("FineWood", 2); item66.CraftAmount = 1; GameObject val133 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "digg_v4_pickaxelava"); GameObject val134 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_pickaxelava_hit"); GameObject val135 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_pickaxelava_swing"); GameObject val136 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_rock_destroyed_pickaxelava"); GameObject val137 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_Place_digg_pickaxelava"); Item item67 = new Item("mar_deepnorth_glitnir", "Glitnir_IceFungus"); item67.Name.Portuguese_Brazilian("Fungo do Gelo"); item67.Name.English("Ice Fungus"); item67.Description.Portuguese_Brazilian("Pode ser consumido ou usado em receitas"); item67.Description.English("Can be consumed or used in recipes"); Item item68 = new Item("mar_deepnorth_glitnir", "Frozen_Wood"); item68.Name.Portuguese_Brazilian("Madeira congelada"); item68.Name.English("Frozen Wood"); item68.Description.Portuguese_Brazilian("Madeira congelada"); item68.Description.English("Frozen Wood"); GameObject val138 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pickable_Glitnir_IceFungus01"); GameObject val139 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pickable_Glitnir_IceFungus02"); GameObject val140 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pickable_Glitnir_IceFungus03"); Item item69 = new Item("mar_deepnorth_glitnir", "SjarSon_Shield01"); item69.Name.English("Sjar Son Shield"); item69.Description.English("Sjar Son Mace"); item69.Configurable = Configurability.Disabled; Item item70 = new Item("mar_deepnorth_glitnir", "SjarSon_Shield02"); item70.Name.English("Sjar Son Shield"); item70.Description.English("Sjar Son Shield"); item70.Configurable = Configurability.Disabled; Item item71 = new Item("mar_deepnorth_glitnir", "FrozenCore_Glitnir"); item71.Name.English("Frozen Core"); item71.Name.Portuguese_Brazilian("Núcleo Congelado"); item71.Description.English("Frozen Core"); item71.Description.Portuguese_Brazilian("Núcleo Congelado"); item71.Configurable = Configurability.Disabled; Item item72 = new Item("mar_deepnorth_glitnir", "RostrokarckAssado"); item72.Name.English("Rostrokarck Roast"); item72.Description.English("Rostrokarck Roast"); item72.Name.Portuguese_Brazilian("Assado de Rostrokarck"); item72.Description.Portuguese_Brazilian("Assado de Rostrokarck"); item72.Configurable = Configurability.Disabled; BuildPiece buildPiece = new BuildPiece("mar_deepnorth_glitnir", "RostrokarckAssado"); buildPiece.Category.Set("Glitnir"); buildPiece.Tool.Add("Feaster"); buildPiece.Name.English("Rostrokarck Roast"); buildPiece.Name.Portuguese_Brazilian("Assado de Rostrokarck"); buildPiece.Description.Portuguese_Brazilian("Assado de Rostrokarck"); buildPiece.Description.English("Rostrokarck Roast"); buildPiece.RequiredItems.Add("RostrokarckAssado", 1, recover: true); dng_forno.Add(item14.Prefab, item72.Prefab); Item item73 = new Item("mar_deepnorth_glitnir", "BanqueteGlitnir_Material"); item73.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item73.Name.English("Glitnir Feaster"); item73.Description.English("Glitnir Feaster"); item73.Name.Portuguese_Brazilian("Banquete Glitnir"); item73.Description.Portuguese_Brazilian("Banquete Glitnir"); item73.RequiredItems.Add("SharkFinCooked_Glitnir", 2); item73.RequiredItems.Add("GlitnirWolfMeat_cooked", 4); item73.RequiredItems.Add("Fish10", 2); item73.RequiredItems.Add("Glitnir_WyrmWing", 1); item73.Configurable = Configurability.Disabled; Item item74 = new Item("mar_deepnorth_glitnir", "BanqueteGlitnir"); item74.Name.English("Glitnir Feaster"); item74.Description.English("Glitnir Feaster"); item74.Name.Portuguese_Brazilian("Banquete Glitnir"); item74.Description.Portuguese_Brazilian("Banquete Glitnir"); item74.Configurable = Configurability.Disabled; BuildPiece buildPiece2 = new BuildPiece("mar_deepnorth_glitnir", "BanqueteGlitnir"); buildPiece2.Category.Set("Glitnir"); buildPiece2.Tool.Add("Feaster"); buildPiece2.Name.English("Glitnir Feaster"); buildPiece2.Name.Portuguese_Brazilian("Glitnir Feaster"); buildPiece2.Description.Portuguese_Brazilian("Banquete Glitnir"); buildPiece2.Description.English("Glitnir Feaster"); buildPiece2.RequiredItems.Add("BanqueteGlitnir_Material", 1, recover: true); Item item75 = new Item("mar_deepnorth_glitnir", "SharkFin_Glitnir"); item75.Name.English("Shark Fin"); item75.Description.English("Shark Fin"); item75.Name.Portuguese_Brazilian("Barbatana de tubarão"); item75.Description.Portuguese_Brazilian("Barbatana de tubarão"); item75.Configurable = Configurability.Disabled; Item item76 = new Item("mar_deepnorth_glitnir", "SharkFinCooked_Glitnir"); item76.Name.English("Shark Fin Roasted"); item76.Description.English("Shark Fin Roasted"); item76.Name.Portuguese_Brazilian("Barbatana Assada"); item76.Description.Portuguese_Brazilian("Barbatana Assada"); item76.Configurable = Configurability.Disabled; dng_fogueira.Add(item75.Prefab, item76.Prefab); Item item77 = new Item("mar_deepnorth_glitnir", "CervejaCongelante"); item77.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item77.Name.English("Freezing Beer"); item77.Description.English("Freezing Beer"); item77.Name.Portuguese_Brazilian("Cerveja Congelante"); item77.Description.Portuguese_Brazilian("Cerveja Congelante"); item77.RequiredItems.Add("Glitnir_IceFungus", 4); item77.RequiredItems.Add("Barley", 10); item77.RequiredItems.Add("Glitnir_WyrmWing", 2); item77.Configurable = Configurability.Disabled; BuildPiece buildPiece3 = new BuildPiece("mar_deepnorth_glitnir", "CervejaCongelante"); buildPiece3.Category.Set("Glitnir"); buildPiece3.Tool.Add("Feaster"); buildPiece3.Name.English("Freezing Beer"); buildPiece3.Name.Portuguese_Brazilian("Cerveja Congelante"); buildPiece3.Description.English("Freezing Beer"); buildPiece3.Description.Portuguese_Brazilian("Cerveja Congelante"); buildPiece3.RequiredItems.Add("CervejaCongelante", 1, recover: true); Item item78 = new Item("mar_deepnorth_glitnir", "EnsopadoEscorpiao"); item78.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item78.Name.English("Scorpion Stew"); item78.Description.English("Scorpion Stew"); item78.Name.Portuguese_Brazilian("Ensopado de escorpião"); item78.Description.Portuguese_Brazilian("Ensopado de escorpião"); item78.RequiredItems.Add("SnowScorpionTail", 1); item78.RequiredItems.Add("Carrot", 5); item78.RequiredItems.Add("Onion", 2); item78.RequiredItems.Add("Honey", 2); item78.Configurable = Configurability.Disabled; BuildPiece buildPiece4 = new BuildPiece("mar_deepnorth_glitnir", "EnsopadoEscorpiao"); buildPiece4.Category.Set("Glitnir"); buildPiece4.Tool.Add("Feaster"); buildPiece4.Name.English("Scorpion Stew"); buildPiece4.Name.Portuguese_Brazilian("Ensopado de escorpião"); buildPiece4.Description.English("Scorpion Stew"); buildPiece4.Description.Portuguese_Brazilian("Ensopado de escorpião"); buildPiece4.RequiredItems.Add("EnsopadoEscorpiao", 1, recover: true); Item item79 = new Item("mar_deepnorth_glitnir", "EnsopadoLobo"); item79.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item79.Name.English("Wolf Stew"); item79.Description.English("Wolf Stew"); item79.Name.Portuguese_Brazilian("Ensopado de lobo"); item79.Description.Portuguese_Brazilian("Ensopado de lobo"); item79.RequiredItems.Add("GlitnirWolfMeat_cooked", 2); item79.RequiredItems.Add("Glitnir_IceFungus", 4); item79.RequiredItems.Add("Honey", 2); item79.RequiredItems.Add("Bloodbag", 2); item79.Configurable = Configurability.Disabled; BuildPiece buildPiece5 = new BuildPiece("mar_deepnorth_glitnir", "EnsopadoLobo"); buildPiece5.Category.Set("Glitnir"); buildPiece5.Tool.Add("Feaster"); buildPiece5.Name.English("Wolf Stew"); buildPiece5.Name.Portuguese_Brazilian("Ensopado de lobo"); buildPiece5.Description.English("Wolf Stew"); buildPiece5.Description.Portuguese_Brazilian("Ensopado de lobo"); buildPiece5.RequiredItems.Add("EnsopadoLobo", 1, recover: true); Item item80 = new Item("mar_deepnorth_glitnir", "EspetinhoTroll"); item80.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item80.Name.English("Troll skewer"); item80.Description.English("Troll skewer"); item80.Name.Portuguese_Brazilian("Espetinho de troll"); item80.Description.Portuguese_Brazilian("Espetinho de troll"); item80.RequiredItems.Add("TrollLiver_Cooked", 1); item80.RequiredItems.Add("Onion", 4); item80.RequiredItems.Add("Dandelion", 2); item80.Configurable = Configurability.Disabled; BuildPiece buildPiece6 = new BuildPiece("mar_deepnorth_glitnir", "EspetinhoTroll"); buildPiece6.Category.Set("Glitnir"); buildPiece6.Tool.Add("Feaster"); buildPiece6.Name.English("Troll skewer"); buildPiece6.Name.Portuguese_Brazilian("Espetinho de troll"); buildPiece6.Description.English("Troll skewer"); buildPiece6.Description.Portuguese_Brazilian("Espetinho de troll"); buildPiece6.RequiredItems.Add("EspetinhoTroll", 1, recover: true); Item item81 = new Item("mar_deepnorth_glitnir", "RocamboleWyrmCru"); item81.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item81.Name.English("Wyrm Roll"); item81.Description.English("Wyrm Roll"); item81.Name.Portuguese_Brazilian("Rocambole de Wyrm"); item81.Description.Portuguese_Brazilian("Rocambole de Wyrm"); item81.RequiredItems.Add("Glitnir_WyrmWing", 2); item81.RequiredItems.Add("Turnip", 4); item81.RequiredItems.Add("Bloodbag", 2); item81.Configurable = Configurability.Disabled; Item item82 = new Item("mar_deepnorth_glitnir", "RocamboleWyrm"); item82.Name.English("Wyrm Roll"); item82.Description.English("Wyrm Roll"); item82.Name.Portuguese_Brazilian("Rocambole de Wyrm"); item82.Description.Portuguese_Brazilian("Rocambole de Wyrm"); item82.Configurable = Configurability.Disabled; BuildPiece buildPiece7 = new BuildPiece("mar_deepnorth_glitnir", "RocamboleWyrm"); buildPiece7.Category.Set("Glitnir"); buildPiece7.Tool.Add("Feaster"); buildPiece7.Name.English("Wyrm Roll"); buildPiece7.Name.Portuguese_Brazilian("Rocambole de Wyrm"); buildPiece7.Description.Portuguese_Brazilian("Rocambole de Wyrm"); buildPiece7.Description.English("Wyrm Roll"); buildPiece7.RequiredItems.Add("RocamboleWyrm", 1, recover: true); dng_forno.Add(item81.Prefab, item82.Prefab); Item item83 = new Item("mar_deepnorth_glitnir", "SopaSalmao"); item83.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item83.Name.English("Salmon soup"); item83.Description.English("Salmon soup"); item83.Name.Portuguese_Brazilian("Sopa de Salmão"); item83.Description.Portuguese_Brazilian("Sopa de Salmão"); item83.RequiredItems.Add("Fish10", 2); item83.RequiredItems.Add("Honey", 4); item83.RequiredItems.Add("Bloodbag", 4); item83.Configurable = Configurability.Disabled; BuildPiece buildPiece8 = new BuildPiece("mar_deepnorth_glitnir", "SopaSalmao"); buildPiece8.Category.Set("Glitnir"); buildPiece8.Tool.Add("Feaster"); buildPiece8.Name.English("Salmon soup"); buildPiece8.Name.Portuguese_Brazilian("Sopa de Salmão"); buildPiece8.Description.English("Salmon soup"); buildPiece8.Description.Portuguese_Brazilian("Sopa de Salmão"); buildPiece8.RequiredItems.Add("SopaSalmao", 1, recover: true); BuildPiece buildPiece9 = new BuildPiece("mar_deepnorth_glitnir", "piece_frozenforge"); buildPiece9.Crafting.Set(PieceManager.CraftingTable.None); buildPiece9.Category.Set("Glitnir"); buildPiece9.Name.Portuguese_Brazilian("Forja Congelada"); buildPiece9.Name.English("Frozen Forge"); buildPiece9.Description.Portuguese_Brazilian("Forja usada na criação dos itens do DeepNoth."); buildPiece9.Description.English("Forge used to create items in DeepNoth."); buildPiece9.RequiredItems.Add("Resin", 1, recover: true); buildPiece9.RequiredItems.Add("Wood", 1, recover: true); buildPiece9.RequiredItems.Add("Stone", 1, recover: true); buildPiece9.RequiredItems.Add("Dandelion", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece9.Prefab, MaterialReplacer.ShaderType.UseUnityShader); GameObject val141 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_gui_craftitem_frozenforge"); GameObject val142 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_gui_craftitem_frozenforge_end"); GameObject val143 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_gui_repairitem_frozenforge"); GameObject val144 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_backstab_dnglitnir"); GameObject val145 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_crit_dnglitnir"); GameObject val146 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_pet_dnglitnir"); GameObject val147 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_tamed_dnglitnir"); GameObject val148 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_birth_dnglitnir"); GameObject val149 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_corpse_big_dnglitnir"); GameObject val150 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_corpse_medium_dnglitnir"); GameObject val151 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_corpse_mini_dnglitnir"); GameObject val152 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_HitSparks_dng"); GameObject val153 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_HitSparks_dng1"); GameObject val154 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_hit_dnglitnir"); GameObject val155 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_love_dnglitnir"); GameObject val156 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_soothed_dnglitnir"); GameObject val157 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_wsurface_small_dnglitnir"); GameObject val158 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_wsurface_medium_dnglitnir"); GameObject val159 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_arrow_hit_dng"); GameObject val160 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_frostarrow_hit_dnglitnir"); GameObject val161 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_block_camshake_dng"); GameObject val162 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_blocked_dng"); GameObject val163 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wood_blocked_dng"); GameObject val164 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_bow_fire_dng"); GameObject val165 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_alerted_dnglitnir"); GameObject val166 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_die_vikings_dnglitnir"); GameObject val167 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_hit_vikings_dnglitnir"); GameObject val168 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_death_vikings_dnglitnir"); GameObject val169 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_clubhit_dng"); GameObject val170 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_club_hit_dng"); GameObject val171 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_metal_blocked_dng"); GameObject val172 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_swing_camshake_dng"); GameObject val173 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_club_swing_dng"); GameObject val174 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjarson_aoe"); GameObject val175 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sjarsontroll_aoe"); GameObject val176 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_axe_hit_dnglitnir"); GameObject val177 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_axe_swing_dnglitnir"); GameObject val178 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_hit_camshake_dng"); GameObject val179 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_death_dnglitnir"); GameObject val180 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_SawDust_dnglitnir"); GameObject val181 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "IceBush01"); GameObject val182 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "IceBush02"); GameObject val183 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "IceBush03"); GameObject val184 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "MineRock_DeepNorth_01"); GameObject val185 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "MineRock_DeepNorth_02"); GameObject val186 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "MineRock_DeepNorth_03"); GameObject val187 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "MineRock_DeepNorth_04"); GameObject val188 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pinus01"); GameObject val189 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pinus02"); GameObject val190 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pinus03"); GameObject val191 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pinus04"); GameObject val192 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pinus_log"); GameObject val193 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Pinus_log_half"); GameObject val194 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "PinusStub"); GameObject val195 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_tree_fall_dnglitnir"); GameObject val196 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_tree_hit_dnglitnir"); GameObject val197 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_treecut_dnglitnir"); GameObject val198 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_pinustree_fall_hit"); GameObject val199 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_pinustree_hit"); GameObject val200 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_pinuswood_break"); GameObject val201 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_pinuslogdestroyed_half"); GameObject val202 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_pinuslogdestroyed"); GameObject val203 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_pinustree_fall_hit"); GameObject val204 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_pickable_icefungus"); GameObject val205 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_pickable_icefungus"); GameObject val206 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_rock_destroyed_glitnir"); GameObject val207 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_rock_hit_glitnir"); GameObject val208 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_RockDestroyed_glitnir"); GameObject val209 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_RockHit_glitnir"); GameObject val210 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_teia_hit_dnglitnir"); GameObject val211 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_build_hammer_wood_dnglitnir"); GameObject val212 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_Place_wood_pole_dnglitnir"); GameObject val213 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_wood_destroyed_dnglitnir"); GameObject val214 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_GlitnirChestClose"); GameObject val215 = ItemManager.PrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_GlitnirChestOpen"); GameObject val216 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "Glitnir_LootChest"); GameObject val217 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_unarmed_hit_glitnir"); GameObject val218 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_FeastSmall_dng"); GameObject val219 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_Eat_dng"); GameObject val220 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_eat_dng"); GameObject val221 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_feast_destroyed_dng"); GameObject val222 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "fx_FeastEat_dng"); GameObject val223 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_MeadBurp_dng"); GameObject val224 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_Potion_health_Start_dng"); GameObject val225 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_LightFoot_dng"); GameObject val226 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_MeadSplash_dng"); GameObject val227 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_poisonhit_queen"); GameObject val228 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "glitnir_rp"); GameObject val229 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "sfx_bush_hit_dng"); GameObject val230 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_bush_destroyed_dng"); GameObject val231 = PiecePrefabManager.RegisterPrefab("mar_deepnorth_glitnir", "vfx_bush_leaf_puff_dng"); SetupWatcher(); _harmony.PatchAll(); } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); } private void SetupWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName); fileSystemWatcher.Changed += ReadConfigValues; fileSystemWatcher.Created += ReadConfigValues; fileSystemWatcher.Renamed += ReadConfigValues; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; } private void ReadConfigValues(object sender, FileSystemEventArgs e) { if (!File.Exists(ConfigFileFullPath)) { return; } try { DeepNorthGlitnirLogger.LogDebug((object)"ReadConfigValues called"); ((BaseUnityPlugin)this).Config.Reload(); } catch { DeepNorthGlitnirLogger.LogError((object)("There was an issue loading your " + ConfigFileName)); DeepNorthGlitnirLogger.LogError((object)"Please check your config entries for spelling and format!"); } } private ConfigEntry config<[Nullable(2)] T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags); ConfigEntry val2 = ((BaseUnityPlugin)this).Config.Bind(group, name, value, val); SyncedConfigEntry syncedConfigEntry = ConfigSync.AddConfigEntry(val2); syncedConfigEntry.SynchronizedConfig = synchronizedSetting; return val2; } private ConfigEntry config<[Nullable(2)] T>(string group, string name, T value, string description, bool synchronizedSetting = true) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty()), synchronizedSetting); } static DeepNorthGlitnirPlugin() { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName; dng_fogueira = new Dictionary(); dng_forno = new Dictionary(); DeepNorthGlitnirLogger = Logger.CreateLogSource("DeepNorthGlitnir"); ConfigSync = new ConfigSync("wesley.DeepNorthGlitnir") { DisplayName = "DeepNorthGlitnir", CurrentVersion = "0.2.4", MinimumRequiredVersion = "0.2.4" }; } } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<62d4b16e-3893-443a-a39b-5ae141b095d6>Embedded] internal sealed class <62d4b16e-3893-443a-a39b-5ae141b095d6>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<62d4b16e-3893-443a-a39b-5ae141b095d6>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <6d2be70d-6a71-4d4c-b860-b6543c200224>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <6d2be70d-6a71-4d4c-b860-b6543c200224>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <6d2be70d-6a71-4d4c-b860-b6543c200224>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [<62d4b16e-3893-443a-a39b-5ae141b095d6>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContextAttribute : Attribute { public readonly byte Flag; public <41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [<62d4b16e-3893-443a-a39b-5ae141b095d6>Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ItemManager { [PublicAPI] internal enum CraftingTable { Disabled, Inventory, [InternalName("piece_workbench")] Workbench, [InternalName("piece_cauldron")] Cauldron, [InternalName("piece_MeadCauldron")] MeadCauldron, [InternalName("forge")] Forge, [InternalName("piece_artisanstation")] ArtisanTable, [InternalName("piece_stonecutter")] StoneCutter, [InternalName("piece_magetable")] MageTable, [InternalName("piece_preptable")] PrepTable, [InternalName("blackforge")] BlackForge, Custom } [PublicAPI] internal enum ConversionPiece { Disabled, [InternalName("smelter")] Smelter, [InternalName("charcoal_kiln")] CharcoalKiln, [InternalName("blastfurnace")] BlastFurnace, [InternalName("windmill")] Windmill, [InternalName("piece_spinningwheel")] SpinningWheel, [InternalName("eitrrefinery")] EitrRefinery, Custom } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(1)] [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] internal class InternalName : Attribute { public readonly string internalName; public InternalName(string internalName) { this.internalName = internalName; } } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(1)] [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] [PublicAPI] internal class RequiredResourceList { public readonly List Requirements = new List(); public bool Free; public void Add(string itemName, int amount, int quality = 0) { Requirements.Add(new Requirement { itemName = itemName, amount = amount, quality = quality }); } public void Add(string itemName, ConfigEntry amountConfig, int quality = 0) { Requirements.Add(new Requirement { itemName = itemName, amountConfig = amountConfig, quality = quality }); } } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(1)] [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] [PublicAPI] internal class CraftingStationList { public readonly List Stations = new List(); public void Add(CraftingTable table, int level) { Stations.Add(new CraftingStationConfig { Table = table, level = level }); } public void Add(string customTable, int level) { Stations.Add(new CraftingStationConfig { Table = CraftingTable.Custom, level = level, custom = customTable }); } } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(1)] [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] [PublicAPI] internal class ItemRecipe { public readonly RequiredResourceList RequiredItems = new RequiredResourceList(); public readonly RequiredResourceList RequiredUpgradeItems = new RequiredResourceList(); public readonly CraftingStationList Crafting = new CraftingStationList(); public int CraftAmount = 1; public bool RequireOnlyOneIngredient; public float QualityResultAmountMultiplier = 1f; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] public ConfigEntryBase RecipeIsActive; } [PublicAPI] internal class Trade { public Trader Trader; public uint Price; public uint Stack = 1u; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] public string RequiredGlobalKey; } [PublicAPI] [Flags] internal enum Trader { None = 0, Haldor = 1, Hildir = 2 } internal struct Requirement { [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(1)] public string itemName; public int amount; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] public ConfigEntry amountConfig; [Description("Set to a non-zero value to apply the requirement only for a specific quality")] public int quality; } internal struct CraftingStationConfig { public CraftingTable Table; public int level; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] public string custom; } [Flags] internal enum Configurability { Disabled = 0, Recipe = 1, Stats = 2, Drop = 4, Trader = 8, Full = 0xF } [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] [PublicAPI] [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(1)] internal class DropTargets { public readonly List Drops = new List(); public void Add(string creatureName, float chance, int min = 1, int? max = null, bool levelMultiplier = true) { Drops.Add(new DropTarget { creature = creatureName, chance = chance, min = min, max = max.GetValueOrDefault(min), levelMultiplier = levelMultiplier }); } } internal struct DropTarget { [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(1)] public string creature; public int min; public int max; public float chance; public bool levelMultiplier; } internal enum Toggle { On = 1, Off = 0 } [PublicAPI] [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(1)] internal class Item { [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] private class ItemConfig { [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 2, 1 })] public ConfigEntry craft; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 2, 1 })] public ConfigEntry upgrade; public ConfigEntry table; public ConfigEntry tableLevel; public ConfigEntry customTable; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] public ConfigEntry maximumTableLevel; public ConfigEntry requireOneIngredient; public ConfigEntry qualityResultAmountMultiplier; } [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] private class TraderConfig { public ConfigEntry trader; public ConfigEntry price; public ConfigEntry stack; public ConfigEntry requiredGlobalKey; } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] private class RequirementQuality { public int quality; } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(2)] [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [UsedImplicitly] public string Category; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 2, 1 })] [UsedImplicitly] public Action CustomDrawer; public Func browsability; } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] [PublicAPI] public enum DamageModifier { Normal, Resistant, Weak, Immune, Ignore, VeryResistant, VeryWeak, None } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] private delegate void setDmgFunc(ref DamageTypes dmg, float value); [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] private class SerializedRequirements { public readonly List Reqs; public SerializedRequirements(List reqs) { Reqs = reqs; } public SerializedRequirements(string reqs) : this(reqs.Split(new char[1] { ',' }).Select([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (string r) => { string[] array = r.Split(new char[1] { ':' }); Requirement result = default(Requirement); result.itemName = array[0]; result.amount = ((array.Length <= 1 || !int.TryParse(array[1], out var result2)) ? 1 : result2); result.quality = ((array.Length > 2 && int.TryParse(array[2], out var result3)) ? result3 : 0); return result; }).ToList()) { } public override string ToString() { return string.Join(",", Reqs.Select([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (Requirement r) => $"{r.itemName}:{r.amount}" + ((r.quality > 0) ? $":{r.quality}" : ""))); } [return: <6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] public static ItemDrop fetchByName(ObjectDB objectDB, string name) { GameObject itemPrefab = objectDB.GetItemPrefab(name); ItemDrop obj = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)obj == (Object)null) { Debug.LogWarning((object)("The required item '" + name + "' does not exist.")); } return obj; } public static Requirement[] toPieceReqs(ObjectDB objectDB, SerializedRequirements craft, SerializedRequirements upgrade) { //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: 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_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Expected O, but got Unknown //IL_0194: Expected O, but got Unknown //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Expected O, but got Unknown Dictionary dictionary = craft.Reqs.Where((Requirement r) => r.itemName != "").ToDictionary((Func)([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (Requirement r) => r.itemName), (Func)([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (Requirement r) => { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_003e: Expected O, but got Unknown ItemDrop val6 = ResItem(r); return (val6 != null) ? new Requirement { m_amount = (r.amountConfig?.Value ?? r.amount), m_resItem = val6, m_amountPerLevel = 0 } : ((Requirement)null); })); List list = dictionary.Values.Where([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (Requirement v) => v != null).ToList(); foreach (Requirement item in upgrade.Reqs.Where((Requirement r) => r.itemName != "")) { if (item.quality > 0) { ItemDrop val = ResItem(item); if (val != null) { Requirement val2 = new Requirement { m_resItem = val, m_amountPerLevel = (item.amountConfig?.Value ?? item.amount), m_amount = 0 }; list.Add(val2); requirementQuality.Add(val2, new RequirementQuality { quality = item.quality }); } continue; } if (!dictionary.TryGetValue(item.itemName, out var value) || value == null) { ItemDrop val3 = ResItem(item); if (val3 != null) { string itemName = item.itemName; Requirement val4 = new Requirement { m_resItem = val3, m_amount = 0 }; Requirement val5 = val4; dictionary[itemName] = val4; value = val5; list.Add(value); } } if (value != null) { value.m_amountPerLevel = item.amountConfig?.Value ?? item.amount; } } return list.ToArray(); [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(2)] ItemDrop ResItem(Requirement r) { return fetchByName(objectDB, r.itemName); } } } [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] private class SerializedDrop { public readonly List Drops; public SerializedDrop(List drops) { Drops = drops; } public SerializedDrop(string drops) { Drops = ((drops == "") ? ((IEnumerable)Array.Empty()) : ((IEnumerable)drops.Split(new char[1] { ',' }))).Select([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (string r) => { string[] array = r.Split(new char[1] { ':' }); if (array.Length <= 2 || !int.TryParse(array[2], out var result)) { result = 1; } if (array.Length <= 3 || !int.TryParse(array[3], out var result2)) { result2 = result; } bool levelMultiplier = array.Length <= 4 || array[4] != "0"; DropTarget result3 = default(DropTarget); result3.creature = array[0]; result3.chance = ((array.Length > 1 && float.TryParse(array[1], out var result4)) ? result4 : 1f); result3.min = result; result3.max = result2; result3.levelMultiplier = levelMultiplier; return result3; }).ToList(); } public override string ToString() { return string.Join(",", Drops.Select([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (DropTarget r) => $"{r.creature}:{r.chance.ToString(CultureInfo.InvariantCulture)}:{r.min}:" + ((r.min == r.max) ? "" : $"{r.max}") + (r.levelMultiplier ? "" : ":0"))); } [return: <6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private static Character fetchByName(ZNetScene netScene, string name) { GameObject prefab = netScene.GetPrefab(name); Character obj = ((prefab != null) ? prefab.GetComponent() : null); if ((Object)(object)obj == (Object)null) { Debug.LogWarning((object)("The drop target character '" + name + "' does not exist.")); } return obj; } public Dictionary toCharacterDrops(ZNetScene netScene, GameObject item) { //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_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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) //IL_006f: Expected O, but got Unknown Dictionary dictionary = new Dictionary(); foreach (DropTarget drop in Drops) { Character val = fetchByName(netScene, drop.creature); if (val != null) { dictionary[val] = new Drop { m_prefab = item, m_amountMin = drop.min, m_amountMax = drop.max, m_chance = drop.chance, m_levelMultiplier = drop.levelMultiplier }; } } return dictionary; } } [CompilerGenerated] private sealed class <>c__DisplayClass83_0 { public Quaternion? cameraRotation; public float lightIntensity; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] public ItemDrop item; public Quaternion? itemRotation; } [CompilerGenerated] private sealed class d__85 : IEnumerable, IEnumerable, IEnumerator, IDisposable, IEnumerator { private int <>1__state; private CodeInstruction <>2__current; private int <>l__initialThreadId; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 0, 1 })] private IEnumerable instructions; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 0, 1 })] public IEnumerable <>3__instructions; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 0, 1 })] private List 5__2; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] private FieldInfo 5__3; private int 5__4; CodeInstruction IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public d__85(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; 5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Expected O, but got Unknown //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Expected O, but got Unknown int num; switch (<>1__state) { default: return false; case 0: <>1__state = -1; 5__2 = instructions.ToList(); 5__3 = AccessTools.DeclaredField(typeof(Recipe), "m_amount"); 5__4 = 0; break; case 1: <>1__state = -1; if (5__4 > 1 && 5__2[5__4 - 2].opcode == OpCodes.Ldfld && CodeInstructionExtensions.OperandIs(5__2[5__4 - 2], (MemberInfo)5__3) && 5__2[5__4 - 1].opcode == OpCodes.Ldc_I4_1 && 5__2[5__4].operand is Label) { <>2__current = new CodeInstruction(OpCodes.Ldarg_0, (object)null); <>1__state = 2; return true; } goto IL_01b2; case 2: <>1__state = -1; <>2__current = new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(Item), "CheckItemIsUpgrade", (Type[])null, (Type[])null)); <>1__state = 3; return true; case 3: <>1__state = -1; <>2__current = new CodeInstruction(OpCodes.Brtrue, 5__2[5__4].operand); <>1__state = 4; return true; case 4: { <>1__state = -1; goto IL_01b2; } IL_01b2: num = 5__4 + 1; 5__4 = num; break; } if (5__4 < 5__2.Count) { <>2__current = 5__2[5__4]; <>1__state = 1; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] [return: <6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] IEnumerator IEnumerable.GetEnumerator() { d__85 d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; d__ = this; } else { d__ = new d__85(0); } d__.instructions = <>3__instructions; return d__; } [DebuggerHidden] [return: <6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); } } private static readonly List registeredItems = new List(); private static readonly Dictionary itemDropMap = new Dictionary(); private static Dictionary>> activeRecipes = new Dictionary>>(); [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 1, 1, 2 })] private static Dictionary hiddenCraftRecipes = new Dictionary(); [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 1, 1, 2 })] private static Dictionary hiddenUpgradeRecipes = new Dictionary(); private static Dictionary> itemCraftConfigs = new Dictionary>(); private static Dictionary> itemDropConfigs = new Dictionary>(); private Dictionary characterDrops = new Dictionary(); private readonly Dictionary statsConfigs = new Dictionary(); private static readonly ConditionalWeakTable requirementQuality = new ConditionalWeakTable(); public static Configurability DefaultConfigurability = Configurability.Full; public Configurability? Configurable; private Configurability configurationVisible = Configurability.Full; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private TraderConfig traderConfig; public readonly GameObject Prefab; [Description("Specifies the maximum required crafting station level to upgrade and repair the item.\nDefault is calculated from crafting station level and maximum quality.")] public int MaximumRequiredStationLevel = int.MaxValue; [Description("Assigns the item as a drop item to a creature.\nUses a creature name, a drop chance and a minimum and maximum amount.")] public readonly DropTargets DropsFrom = new DropTargets(); [Description("Configures whether the item can be bought at the trader.\nDon't forget to set cost to something above 0 or the item will be sold for free.")] public readonly Trade Trade = new Trade(); internal List Conversions = new List(); internal List conversions = new List(); public Dictionary Recipes = new Dictionary(); [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private LocalizeKey _name; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private LocalizeKey _description; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private static object configManager; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private static Localization _english; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private static BaseUnityPlugin _plugin; private static bool hasConfigSync = true; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private static object _configSync; private Configurability configurability => Configurable ?? DefaultConfigurability; [Description("Specifies the resources needed to craft the item.\nUse .Add to add resources with their internal ID and an amount.\nUse one .Add for each resource type the item should need.")] public RequiredResourceList RequiredItems => this[""].RequiredItems; [Description("Specifies the resources needed to upgrade the item.\nUse .Add to add resources with their internal ID and an amount. This amount will be multipled by the item quality level.\nUse one .Add for each resource type the upgrade should need.")] public RequiredResourceList RequiredUpgradeItems => this[""].RequiredUpgradeItems; [Description("Specifies the crafting station needed to craft the item.\nUse .Add to add a crafting station, using the CraftingTable enum and a minimum level for the crafting station.\nUse one .Add for each crafting station.")] public CraftingStationList Crafting => this[""].Crafting; [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] [Description("Specifies a config entry which toggles whether a recipe is active.")] public ConfigEntryBase RecipeIsActive { [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(2)] get { return this[""].RecipeIsActive; } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(2)] set { this[""].RecipeIsActive = value; } } [Description("Specifies the number of items that should be given to the player with a single craft of the item.\nDefaults to 1.")] public int CraftAmount { get { return this[""].CraftAmount; } set { this[""].CraftAmount = value; } } public bool RequireOnlyOneIngredient { get { return this[""].RequireOnlyOneIngredient; } set { this[""].RequireOnlyOneIngredient = value; } } public float QualityResultAmountMultiplier { get { return this[""].QualityResultAmountMultiplier; } set { this[""].QualityResultAmountMultiplier = value; } } public ItemRecipe this[string name] { get { if (Recipes.TryGetValue(name, out var value)) { return value; } return Recipes[name] = new ItemRecipe(); } } public LocalizeKey Name { get { LocalizeKey name = _name; if (name != null) { return name; } SharedData shared = Prefab.GetComponent().m_itemData.m_shared; if (shared.m_name.StartsWith("$")) { _name = new LocalizeKey(shared.m_name); } else { string text = "$item_" + ((Object)Prefab).name.Replace(" ", "_"); _name = new LocalizeKey(text).English(shared.m_name); shared.m_name = text; } return _name; } } public LocalizeKey Description { get { LocalizeKey description = _description; if (description != null) { return description; } SharedData shared = Prefab.GetComponent().m_itemData.m_shared; if (shared.m_description.StartsWith("$")) { _description = new LocalizeKey(shared.m_description); } else { string text = "$itemdesc_" + ((Object)Prefab).name.Replace(" ", "_"); _description = new LocalizeKey(text).English(shared.m_description); shared.m_description = text; } return _description; } } private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English")); private static BaseUnityPlugin plugin { get { //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown if (_plugin == null) { IEnumerable 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([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(2)] private static object configSync { [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(2)] get { if (_configSync == null && hasConfigSync) { Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync"); if ((object)type != null) { _configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " ItemManager"); type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString()); type.GetProperty("IsLocked").SetValue(_configSync, true); } else { hasConfigSync = false; } } return _configSync; } } public Item(string assetBundleFileName, string prefabName, string folderName = "assets") : this(PrefabManager.RegisterAssetBundle(assetBundleFileName, folderName), prefabName) { } public Item(AssetBundle bundle, string prefabName) : this(PrefabManager.RegisterPrefab(bundle, prefabName, addToObjectDb: true), skipRegistering: true) { } public Item(GameObject prefab, bool skipRegistering = false) { if (!skipRegistering) { PrefabManager.RegisterPrefab(prefab, addToObjectDb: true); } Prefab = prefab; registeredItems.Add(this); itemDropMap[Prefab.GetComponent()] = this; Prefab.GetComponent().m_itemData.m_dropPrefab = Prefab; } public void ToggleConfigurationVisibility(Configurability visible) { configurationVisible = visible; if (itemDropConfigs.TryGetValue(this, out var value)) { Toggle((ConfigEntryBase)(object)value, Configurability.Drop); } if (itemCraftConfigs.TryGetValue(this, out var value2)) { foreach (ItemConfig value4 in value2.Values) { ToggleObj(value4, Configurability.Recipe); } } foreach (Conversion conversion in Conversions) { if (conversion.config != null) { ToggleObj(conversion.config, Configurability.Recipe); } } foreach (KeyValuePair statsConfig in statsConfigs) { Toggle(statsConfig.Key, Configurability.Stats); if ((visible & Configurability.Stats) != 0) { statsConfig.Value(); } } reloadConfigDisplay(); void Toggle(ConfigEntryBase cfg, Configurability check) { object[] tags = cfg.Description.Tags; for (int j = 0; j < tags.Length; j++) { if (tags[j] is ConfigurationManagerAttributes configurationManagerAttributes) { configurationManagerAttributes.Browsable = (visible & check) != 0 && (configurationManagerAttributes.browsability == null || configurationManagerAttributes.browsability()); } } } void ToggleObj(object obj, Configurability check) { FieldInfo[] fields = obj.GetType().GetFields(); for (int i = 0; i < fields.Length; i++) { object? value3 = fields[i].GetValue(obj); ConfigEntryBase val = (ConfigEntryBase)((value3 is ConfigEntryBase) ? value3 : null); if (val != null) { Toggle(val, check); } } } } internal static void reloadConfigDisplay() { object obj = configManager?.GetType().GetProperty("DisplayingWindow").GetValue(configManager); if (obj is bool && (bool)obj) { configManager.GetType().GetMethod("BuildSettingList").Invoke(configManager, Array.Empty()); } } private void UpdateItemTableConfig(string recipeKey, CraftingTable table, string customTableValue) { if (activeRecipes.ContainsKey(this) && activeRecipes[this].TryGetValue(recipeKey, out var value)) { value.First().m_enabled = table != CraftingTable.Disabled; if ((uint)table <= 1u) { value.First().m_craftingStation = null; } else if (table == CraftingTable.Custom) { Recipe obj = value.First(); GameObject prefab = ZNetScene.instance.GetPrefab(customTableValue); obj.m_craftingStation = ((prefab != null) ? prefab.GetComponent() : null); } else { value.First().m_craftingStation = ZNetScene.instance.GetPrefab(getInternalName(table)).GetComponent(); } } } private void UpdateCraftConfig(string recipeKey, SerializedRequirements craftRequirements, SerializedRequirements upgradeRequirements) { if (!Object.op_Implicit((Object)(object)ObjectDB.instance) || !activeRecipes.ContainsKey(this) || !activeRecipes[this].TryGetValue(recipeKey, out var value)) { return; } foreach (Recipe item in value) { item.m_resources = SerializedRequirements.toPieceReqs(ObjectDB.instance, craftRequirements, upgradeRequirements); } } internal static void Patch_FejdStartup() { //IL_0e99: Unknown result type (might be due to invalid IL or missing references) //IL_0e9e: Unknown result type (might be due to invalid IL or missing references) //IL_2164: Unknown result type (might be due to invalid IL or missing references) //IL_216e: Expected O, but got Unknown //IL_0f62: Unknown result type (might be due to invalid IL or missing references) //IL_0f65: Unknown result type (might be due to invalid IL or missing references) //IL_0fbb: Expected I4, but got Unknown //IL_0b88: Unknown result type (might be due to invalid IL or missing references) //IL_0b92: Expected O, but got Unknown //IL_030b: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Expected O, but got Unknown //IL_10ef: Unknown result type (might be due to invalid IL or missing references) //IL_10f2: Unknown result type (might be due to invalid IL or missing references) //IL_10f4: Invalid comparison between Unknown and I4 //IL_10f6: Unknown result type (might be due to invalid IL or missing references) //IL_10fa: Invalid comparison between Unknown and I4 //IL_0cab: Unknown result type (might be due to invalid IL or missing references) //IL_0cb5: Expected O, but got Unknown //IL_0d56: Unknown result type (might be due to invalid IL or missing references) //IL_0d60: Expected O, but got Unknown //IL_10fc: Unknown result type (might be due to invalid IL or missing references) //IL_1100: Invalid comparison between Unknown and I4 //IL_03fe: Unknown result type (might be due to invalid IL or missing references) //IL_0408: Expected O, but got Unknown //IL_0e0a: Unknown result type (might be due to invalid IL or missing references) //IL_0e14: Expected O, but got Unknown //IL_12fb: Unknown result type (might be due to invalid IL or missing references) //IL_12fe: Unknown result type (might be due to invalid IL or missing references) //IL_1300: Invalid comparison between Unknown and I4 //IL_1302: Unknown result type (might be due to invalid IL or missing references) //IL_1306: Unknown result type (might be due to invalid IL or missing references) //IL_1308: Invalid comparison between Unknown and I4 //IL_0539: Unknown result type (might be due to invalid IL or missing references) //IL_0543: Expected O, but got Unknown //IL_130a: Unknown result type (might be due to invalid IL or missing references) //IL_130e: Invalid comparison between Unknown and I4 //IL_13e3: Unknown result type (might be due to invalid IL or missing references) //IL_13e8: Unknown result type (might be due to invalid IL or missing references) //IL_13ea: Unknown result type (might be due to invalid IL or missing references) //IL_13ed: Invalid comparison between Unknown and I4 //IL_13ef: Unknown result type (might be due to invalid IL or missing references) //IL_13f3: Invalid comparison between Unknown and I4 //IL_06f0: Unknown result type (might be due to invalid IL or missing references) //IL_06fa: Expected O, but got Unknown //IL_0651: Unknown result type (might be due to invalid IL or missing references) //IL_065b: Expected O, but got Unknown //IL_1462: Unknown result type (might be due to invalid IL or missing references) //IL_1465: Unknown result type (might be due to invalid IL or missing references) //IL_1467: Invalid comparison between Unknown and I4 //IL_07fa: Unknown result type (might be due to invalid IL or missing references) //IL_0804: Expected O, but got Unknown //IL_1469: Unknown result type (might be due to invalid IL or missing references) //IL_146d: Unknown result type (might be due to invalid IL or missing references) //IL_146f: Invalid comparison between Unknown and I4 //IL_1471: Unknown result type (might be due to invalid IL or missing references) //IL_1475: Invalid comparison between Unknown and I4 //IL_15b2: Unknown result type (might be due to invalid IL or missing references) //IL_15b5: Invalid comparison between Unknown and I4 //IL_17b2: Unknown result type (might be due to invalid IL or missing references) //IL_17b9: Invalid comparison between Unknown and I4 //IL_1882: Unknown result type (might be due to invalid IL or missing references) //IL_1887: Unknown result type (might be due to invalid IL or missing references) //IL_1889: Unknown result type (might be due to invalid IL or missing references) //IL_188d: Unknown result type (might be due to invalid IL or missing references) //IL_188f: Invalid comparison between Unknown and I4 //IL_18fe: Unknown result type (might be due to invalid IL or missing references) //IL_1901: Unknown result type (might be due to invalid IL or missing references) //IL_1903: Invalid comparison between Unknown and I4 //IL_1528: Unknown result type (might be due to invalid IL or missing references) //IL_152d: Unknown result type (might be due to invalid IL or missing references) //IL_1905: Unknown result type (might be due to invalid IL or missing references) //IL_1909: Invalid comparison between Unknown and I4 //IL_190b: Unknown result type (might be due to invalid IL or missing references) //IL_190f: Invalid comparison between Unknown and I4 //IL_1d7c: Unknown result type (might be due to invalid IL or missing references) //IL_1d7f: Invalid comparison between Unknown and I4 Type type = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (Assembly a) => a.GetName().Name == "ConfigurationManager")?.GetType("ConfigurationManager.ConfigurationManager"); if (DefaultConfigurability != 0) { bool saveOnConfigSet = plugin.Config.SaveOnConfigSet; plugin.Config.SaveOnConfigSet = false; foreach (Item item4 in registeredItems.Where([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (Item i) => i.configurability != Configurability.Disabled)) { Item item3 = item4; string name2 = item3.Prefab.GetComponent().m_itemData.m_shared.m_name; string englishName = new Regex("[=\\n\\t\\\\\"\\'\\[\\]]*").Replace(english.Localize(name2), "").Trim(); string localizedName = Localization.instance.Localize(name2).Trim(); int order = 0; if ((item3.configurability & Configurability.Recipe) != 0) { itemCraftConfigs[item3] = new Dictionary(); foreach (string item5 in item3.Recipes.Keys.DefaultIfEmpty("")) { string configKey = item5; string text = ((configKey == "") ? "" : (" (" + configKey + ")")); if (!item3.Recipes.ContainsKey(configKey) || item3.Recipes[configKey].Crafting.Stations.Count <= 0) { continue; } ItemConfig itemConfig2 = (itemCraftConfigs[item3][configKey] = new ItemConfig()); ItemConfig cfg = itemConfig2; List hideWhenNoneAttributes = new List(); cfg.table = config(englishName, "Crafting Station" + text, item3.Recipes[configKey].Crafting.Stations.First().Table, new ConfigDescription("Crafting station where " + englishName + " is available.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = (order -= 1), Browsable = ((item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName } })); ConfigurationManagerAttributes customTableAttributes = new ConfigurationManagerAttributes { Order = (order -= 1), browsability = CustomTableBrowsability, Browsable = (CustomTableBrowsability() && (item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName }; cfg.customTable = config(englishName, "Custom Crafting Station" + text, item3.Recipes[configKey].Crafting.Stations.First().custom ?? "", new ConfigDescription("", (AcceptableValueBase)null, new object[1] { customTableAttributes })); cfg.table.SettingChanged += TableConfigChanged; cfg.customTable.SettingChanged += TableConfigChanged; ConfigurationManagerAttributes configurationManagerAttributes = new ConfigurationManagerAttributes { Order = (order -= 1), browsability = TableLevelBrowsability, Browsable = (TableLevelBrowsability() && (item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName }; hideWhenNoneAttributes.Add(configurationManagerAttributes); cfg.tableLevel = config(englishName, "Crafting Station Level" + text, item3.Recipes[configKey].Crafting.Stations.First().level, new ConfigDescription("Required crafting station level to craft " + englishName + ".", (AcceptableValueBase)null, new object[1] { configurationManagerAttributes })); cfg.tableLevel.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { if (activeRecipes.ContainsKey(item3) && activeRecipes[item3].TryGetValue(configKey, out var value6)) { value6.First().m_minStationLevel = cfg.tableLevel.Value; } }; if (item3.Prefab.GetComponent().m_itemData.m_shared.m_maxQuality > 1) { cfg.maximumTableLevel = config(englishName, "Maximum Crafting Station Level" + text, (item3.MaximumRequiredStationLevel == int.MaxValue) ? (item3.Recipes[configKey].Crafting.Stations.First().level + item3.Prefab.GetComponent().m_itemData.m_shared.m_maxQuality - 1) : item3.MaximumRequiredStationLevel, new ConfigDescription("Maximum crafting station level to upgrade and repair " + englishName + ".", (AcceptableValueBase)null, new object[1] { configurationManagerAttributes })); } cfg.requireOneIngredient = config(englishName, "Require only one resource" + text, item3.Recipes[configKey].RequireOnlyOneIngredient ? Toggle.On : Toggle.Off, new ConfigDescription("Whether only one of the ingredients is needed to craft " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = (order -= 1), Category = localizedName } })); ConfigurationManagerAttributes qualityResultAttributes = new ConfigurationManagerAttributes { Order = (order -= 1), browsability = QualityResultBrowsability, Browsable = (QualityResultBrowsability() && (item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName }; cfg.requireOneIngredient.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { if (activeRecipes.ContainsKey(item3) && activeRecipes[item3].TryGetValue(configKey, out var value5)) { foreach (Recipe item6 in value5) { item6.m_requireOnlyOneIngredient = cfg.requireOneIngredient.Value == Toggle.On; } } qualityResultAttributes.Browsable = QualityResultBrowsability(); reloadConfigDisplay(); }; cfg.qualityResultAmountMultiplier = config(englishName, "Quality Multiplier" + text, item3.Recipes[configKey].QualityResultAmountMultiplier, new ConfigDescription("Multiplies the crafted amount based on the quality of the resources when crafting " + englishName + ". Only works, if Require Only One Resource is true.", (AcceptableValueBase)null, new object[1] { qualityResultAttributes })); cfg.qualityResultAmountMultiplier.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { if (activeRecipes.ContainsKey(item3) && activeRecipes[item3].TryGetValue(configKey, out var value4)) { foreach (Recipe item7 in value4) { item7.m_qualityResultAmountMultiplier = cfg.qualityResultAmountMultiplier.Value; } } }; if ((!item3.Recipes[configKey].RequiredItems.Free || item3.Recipes[configKey].RequiredItems.Requirements.Count > 0) && item3.Recipes[configKey].RequiredItems.Requirements.All((Requirement r) => r.amountConfig == null)) { cfg.craft = itemConfig("Crafting Costs" + text, new SerializedRequirements(item3.Recipes[configKey].RequiredItems.Requirements).ToString(), "Item costs to craft " + englishName, isUpgrade: false); } if (item3.Prefab.GetComponent().m_itemData.m_shared.m_maxQuality > 1 && (!item3.Recipes[configKey].RequiredUpgradeItems.Free || item3.Recipes[configKey].RequiredUpgradeItems.Requirements.Count > 0) && item3.Recipes[configKey].RequiredUpgradeItems.Requirements.All((Requirement r) => r.amountConfig == null)) { cfg.upgrade = itemConfig("Upgrading Costs" + text, new SerializedRequirements(item3.Recipes[configKey].RequiredUpgradeItems.Requirements).ToString(), "Item costs per level to upgrade " + englishName, isUpgrade: true); } if (cfg.craft != null) { cfg.craft.SettingChanged += ConfigChanged; } if (cfg.upgrade != null) { cfg.upgrade.SettingChanged += ConfigChanged; } void ConfigChanged(object o, EventArgs e) { item3.UpdateCraftConfig(configKey, new SerializedRequirements(cfg.craft?.Value ?? ""), new SerializedRequirements(cfg.upgrade?.Value ?? "")); } bool CustomTableBrowsability() { return cfg.table.Value == CraftingTable.Custom; } bool ItemBrowsability() { return cfg.table.Value != CraftingTable.Disabled; } bool QualityResultBrowsability() { return cfg.requireOneIngredient.Value == Toggle.On; } void TableConfigChanged(object o, EventArgs e) { item3.UpdateItemTableConfig(configKey, cfg.table.Value, cfg.customTable.Value); customTableAttributes.Browsable = cfg.table.Value == CraftingTable.Custom; foreach (ConfigurationManagerAttributes item8 in hideWhenNoneAttributes) { item8.Browsable = cfg.table.Value != CraftingTable.Disabled; } reloadConfigDisplay(); } bool TableLevelBrowsability() { return cfg.table.Value != CraftingTable.Disabled; } ConfigEntry itemConfig(string name, string value, string desc, bool isUpgrade) { //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Expected O, but got Unknown ConfigurationManagerAttributes configurationManagerAttributes3 = new ConfigurationManagerAttributes { CustomDrawer = drawRequirementsConfigTable(item3, isUpgrade), Order = (order -= 1), browsability = ItemBrowsability, Browsable = (ItemBrowsability() && (item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName }; hideWhenNoneAttributes.Add(configurationManagerAttributes3); return config(englishName, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes3 })); } } if ((item3.configurability & Configurability.Drop) != 0) { ConfigEntry val3 = (itemDropConfigs[item3] = config(englishName, "Drops from", new SerializedDrop(item3.DropsFrom.Drops).ToString(), new ConfigDescription(englishName + " drops from this creature.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { CustomDrawer = drawDropsConfigTable, Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Drop) != 0) } }))); val3.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { item3.UpdateCharacterDrop(); }; } for (int j = 0; j < item3.Conversions.Count; j++) { string text2 = ((item3.Conversions.Count > 1) ? $"{j + 1}. " : ""); Conversion conversion = item3.Conversions[j]; conversion.config = new Conversion.ConversionConfig(); int index = j; conversion.config.input = config(englishName, text2 + "Conversion Input Item", conversion.Input, new ConfigDescription("Input item to create " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Recipe) != 0) } })); conversion.config.input.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { if (index < item3.conversions.Count) { ObjectDB instance = ObjectDB.instance; if (instance != null) { ItemDrop from = SerializedRequirements.fetchByName(instance, conversion.config.input.Value); item3.conversions[index].m_from = from; UpdatePiece(); } } }; conversion.config.piece = config(englishName, text2 + "Conversion Piece", conversion.Piece, new ConfigDescription("Conversion piece used to create " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Recipe) != 0) } })); conversion.config.piece.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { UpdatePiece(); }; conversion.config.customPiece = config(englishName, text2 + "Conversion Custom Piece", conversion.customPiece ?? "", new ConfigDescription("Custom conversion piece to create " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Recipe) != 0) } })); conversion.config.customPiece.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { UpdatePiece(); }; void UpdatePiece() { if (index < item3.conversions.Count && Object.op_Implicit((Object)(object)ZNetScene.instance)) { string text3 = ((conversion.config.piece.Value == ConversionPiece.Disabled) ? null : ((conversion.config.piece.Value == ConversionPiece.Custom) ? conversion.config.customPiece.Value : getInternalName(conversion.config.piece.Value))); string activePiece = conversion.config.activePiece; if (conversion.config.activePiece != null) { int num = ZNetScene.instance.GetPrefab(conversion.config.activePiece).GetComponent().m_conversion.IndexOf(item3.conversions[index]); if (num >= 0) { Smelter[] array3 = Resources.FindObjectsOfTypeAll(); foreach (Smelter val4 in array3) { if (Utils.GetPrefabName(((Component)val4).gameObject) == activePiece) { val4.m_conversion.RemoveAt(num); } } } conversion.config.activePiece = null; } if (item3.conversions[index].m_from != null && conversion.config.piece.Value != 0) { GameObject prefab = ZNetScene.instance.GetPrefab(text3); if (((prefab != null) ? prefab.GetComponent() : null) != null) { conversion.config.activePiece = text3; Smelter[] array3 = Resources.FindObjectsOfTypeAll(); foreach (Smelter val5 in array3) { if (Utils.GetPrefabName(((Component)val5).gameObject) == text3) { val5.m_conversion.Add(item3.conversions[index]); } } } } } } } } if ((item3.configurability & Configurability.Stats) != 0) { item3.statsConfigs.Clear(); SharedData shared2 = item3.Prefab.GetComponent().m_itemData.m_shared; ItemType itemType = shared2.m_itemType; statcfg("Weight", "Weight of " + englishName + ".", (SharedData shared) => shared.m_weight, delegate(SharedData shared, float value) { shared.m_weight = value; }); statcfg("Trader Value", "Trader value of " + englishName + ".", (SharedData shared) => shared.m_value, delegate(SharedData shared, int value) { shared.m_value = value; }); bool flag; switch (itemType - 3) { case 0: case 1: case 2: case 3: case 4: case 8: case 9: case 11: case 14: case 16: case 19: flag = true; break; default: flag = false; break; } if (flag) { statcfg("Durability", "Durability of " + englishName + ".", (SharedData shared) => shared.m_maxDurability, delegate(SharedData shared, float value) { shared.m_maxDurability = value; }); statcfg("Durability per Level", "Durability gain per level of " + englishName + ".", (SharedData shared) => shared.m_durabilityPerLevel, delegate(SharedData shared, float value) { shared.m_durabilityPerLevel = value; }); statcfg("Movement Speed Modifier", "Movement speed modifier of " + englishName + ".", (SharedData shared) => shared.m_movementModifier, delegate(SharedData shared, float value) { shared.m_movementModifier = value; }); } if ((itemType - 3 <= 2 || (int)itemType == 14 || (int)itemType == 22) ? true : false) { statcfg("Block Armor", "Block armor of " + englishName + ".", (SharedData shared) => shared.m_blockPower, delegate(SharedData shared, float value) { shared.m_blockPower = value; }); statcfg("Block Armor per Level", "Block armor per level for " + englishName + ".", (SharedData shared) => shared.m_blockPowerPerLevel, delegate(SharedData shared, float value) { shared.m_blockPowerPerLevel = value; }); statcfg("Block Force", "Block force of " + englishName + ".", (SharedData shared) => shared.m_deflectionForce, delegate(SharedData shared, float value) { shared.m_deflectionForce = value; }); statcfg("Block Force per Level", "Block force per level for " + englishName + ".", (SharedData shared) => shared.m_deflectionForcePerLevel, delegate(SharedData shared, float value) { shared.m_deflectionForcePerLevel = value; }); statcfg("Parry Bonus", "Parry bonus of " + englishName + ".", (SharedData shared) => shared.m_timedBlockBonus, delegate(SharedData shared, float value) { shared.m_timedBlockBonus = value; }); } else if ((itemType - 6 <= 1 || itemType - 11 <= 1 || (int)itemType == 17) ? true : false) { statcfg("Armor", "Armor of " + englishName + ".", (SharedData shared) => shared.m_armor, delegate(SharedData shared, float value) { shared.m_armor = value; }); statcfg("Armor per Level", "Armor per level for " + englishName + ".", (SharedData shared) => shared.m_armorPerLevel, delegate(SharedData shared, float value) { shared.m_armorPerLevel = value; }); } SkillType skillType = shared2.m_skillType; if (((int)skillType == 7 || (int)skillType == 12) ? true : false) { statcfg("Tool tier", "Tool tier of " + englishName + ".", (SharedData shared) => shared.m_toolTier, delegate(SharedData shared, int value) { shared.m_toolTier = value; }); } if ((itemType - 5 <= 2 || itemType - 11 <= 1 || (int)itemType == 17) ? true : false) { Dictionary modifiers = shared2.m_damageModifiers.ToDictionary((DamageModPair d) => d.m_type, (DamageModPair d) => (DamageModifier)d.m_modifier); DamageType[] first = (DamageType[])Enum.GetValues(typeof(DamageType)); DamageType[] array = new DamageType[5]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); foreach (DamageType item9 in first.Except((IEnumerable)(object)array)) { DamageType damageType = item9; statcfg(((object)(DamageType)(ref damageType)).ToString() + " Resistance", ((object)(DamageType)(ref damageType)).ToString() + " resistance of " + englishName + ".", (SharedData _) => (!modifiers.TryGetValue(damageType, out var value3)) ? DamageModifier.None : value3, delegate(SharedData shared, DamageModifier value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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) //IL_002f: 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_0077: 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) DamageModPair val6 = default(DamageModPair); val6.m_type = damageType; val6.m_modifier = (DamageModifier)value; DamageModPair val7 = val6; for (int n = 0; n < shared.m_damageModifiers.Count; n++) { if (shared.m_damageModifiers[n].m_type == damageType) { if (value == DamageModifier.None) { shared.m_damageModifiers.RemoveAt(n); } else { shared.m_damageModifiers[n] = val7; } return; } } if (value != DamageModifier.None) { shared.m_damageModifiers.Add(val7); } }); } } if ((int)itemType == 2 && shared2.m_food > 0f) { statcfg("Health", "Health value of " + englishName + ".", (SharedData shared) => shared.m_food, delegate(SharedData shared, float value) { shared.m_food = value; }); statcfg("Stamina", "Stamina value of " + englishName + ".", (SharedData shared) => shared.m_foodStamina, delegate(SharedData shared, float value) { shared.m_foodStamina = value; }); statcfg("Eitr", "Eitr value of " + englishName + ".", (SharedData shared) => shared.m_foodEitr, delegate(SharedData shared, float value) { shared.m_foodEitr = value; }); statcfg("Duration", "Duration of " + englishName + ".", (SharedData shared) => shared.m_foodBurnTime, delegate(SharedData shared, float value) { shared.m_foodBurnTime = value; }); statcfg("Health Regen", "Health regen value of " + englishName + ".", (SharedData shared) => shared.m_foodRegen, delegate(SharedData shared, float value) { shared.m_foodRegen = value; }); } if ((int)shared2.m_skillType == 10) { statcfg("Health Cost", "Health cost of " + englishName + ".", (SharedData shared) => shared.m_attack.m_attackHealth, delegate(SharedData shared, float value) { shared.m_attack.m_attackHealth = value; }); statcfg("Health Cost Percentage", "Health cost percentage of " + englishName + ".", (SharedData shared) => shared.m_attack.m_attackHealthPercentage, delegate(SharedData shared, float value) { shared.m_attack.m_attackHealthPercentage = value; }); } skillType = shared2.m_skillType; if (skillType - 9 <= 1) { statcfg("Eitr Cost", "Eitr cost of " + englishName + ".", (SharedData shared) => shared.m_attack.m_attackEitr, delegate(SharedData shared, float value) { shared.m_attack.m_attackEitr = value; }); } if ((itemType - 3 <= 1 || (int)itemType == 14 || (int)itemType == 22) ? true : false) { statcfg("Knockback", "Knockback of " + englishName + ".", (SharedData shared) => shared.m_attackForce, delegate(SharedData shared, float value) { shared.m_attackForce = value; }); statcfg("Backstab Bonus", "Backstab bonus of " + englishName + ".", (SharedData shared) => shared.m_backstabBonus, delegate(SharedData shared, float value) { shared.m_backstabBonus = value; }); statcfg("Attack Stamina", "Attack stamina of " + englishName + ".", (SharedData shared) => shared.m_attack.m_attackStamina, delegate(SharedData shared, float value) { shared.m_attack.m_attackStamina = value; }); SetDmg("True", (DamageTypes dmg) => dmg.m_damage, delegate(ref DamageTypes dmg, float val) { dmg.m_damage = val; }); SetDmg("Slash", (DamageTypes dmg) => dmg.m_slash, delegate(ref DamageTypes dmg, float val) { dmg.m_slash = val; }); SetDmg("Pierce", (DamageTypes dmg) => dmg.m_pierce, delegate(ref DamageTypes dmg, float val) { dmg.m_pierce = val; }); SetDmg("Blunt", (DamageTypes dmg) => dmg.m_blunt, delegate(ref DamageTypes dmg, float val) { dmg.m_blunt = val; }); SetDmg("Chop", (DamageTypes dmg) => dmg.m_chop, delegate(ref DamageTypes dmg, float val) { dmg.m_chop = val; }); SetDmg("Pickaxe", (DamageTypes dmg) => dmg.m_pickaxe, delegate(ref DamageTypes dmg, float val) { dmg.m_pickaxe = val; }); SetDmg("Fire", (DamageTypes dmg) => dmg.m_fire, delegate(ref DamageTypes dmg, float val) { dmg.m_fire = val; }); SetDmg("Poison", (DamageTypes dmg) => dmg.m_poison, delegate(ref DamageTypes dmg, float val) { dmg.m_poison = val; }); SetDmg("Frost", (DamageTypes dmg) => dmg.m_frost, delegate(ref DamageTypes dmg, float val) { dmg.m_frost = val; }); SetDmg("Lightning", (DamageTypes dmg) => dmg.m_lightning, delegate(ref DamageTypes dmg, float val) { dmg.m_lightning = val; }); SetDmg("Spirit", (DamageTypes dmg) => dmg.m_spirit, delegate(ref DamageTypes dmg, float val) { dmg.m_spirit = val; }); if ((int)itemType == 4) { statcfg("Projectiles", "Number of projectiles that " + englishName + " shoots at once.", (SharedData shared) => shared.m_attack.m_projectileBursts, delegate(SharedData shared, int value) { shared.m_attack.m_projectileBursts = value; }); statcfg("Burst Interval", "Time between the projectiles " + englishName + " shoots at once.", (SharedData shared) => shared.m_attack.m_burstInterval, delegate(SharedData shared, float value) { shared.m_attack.m_burstInterval = value; }); statcfg("Minimum Accuracy", "Minimum accuracy for " + englishName + ".", (SharedData shared) => shared.m_attack.m_projectileAccuracyMin, delegate(SharedData shared, float value) { shared.m_attack.m_projectileAccuracyMin = value; }); statcfg("Accuracy", "Accuracy for " + englishName + ".", (SharedData shared) => shared.m_attack.m_projectileAccuracy, delegate(SharedData shared, float value) { shared.m_attack.m_projectileAccuracy = value; }); statcfg("Minimum Velocity", "Minimum velocity for " + englishName + ".", (SharedData shared) => shared.m_attack.m_projectileVelMin, delegate(SharedData shared, float value) { shared.m_attack.m_projectileVelMin = value; }); statcfg("Velocity", "Velocity for " + englishName + ".", (SharedData shared) => shared.m_attack.m_projectileVel, delegate(SharedData shared, float value) { shared.m_attack.m_projectileVel = value; }); statcfg("Maximum Draw Time", "Time until " + englishName + " is fully drawn at skill level 0.", (SharedData shared) => shared.m_attack.m_drawDurationMin, delegate(SharedData shared, float value) { shared.m_attack.m_drawDurationMin = value; }); statcfg("Stamina Drain", "Stamina drain per second while drawing " + englishName + ".", (SharedData shared) => shared.m_attack.m_drawStaminaDrain, delegate(SharedData shared, float value) { shared.m_attack.m_drawStaminaDrain = value; }); } } } List traderAttributes; if ((item3.configurability & Configurability.Trader) != 0) { traderAttributes = new List(); item3.traderConfig = new TraderConfig { trader = config(englishName, "Trader Selling", item3.Trade.Trader, new ConfigDescription("Which traders sell " + englishName + ".", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = (order -= 1), Browsable = ((item3.configurationVisible & Configurability.Trader) != 0), Category = localizedName } })) }; item3.traderConfig.trader.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { item3.ReloadTraderConfiguration(); foreach (ConfigurationManagerAttributes item10 in traderAttributes) { item10.Browsable = TraderBrowsability(); } reloadConfigDisplay(); }; item3.traderConfig.price = traderConfig("Trader Price", item3.Trade.Price, "Price of " + englishName + " at the trader."); item3.traderConfig.stack = traderConfig("Trader Stack", item3.Trade.Stack, "Stack size of " + englishName + " in the trader. Also known as the number of items sold by a trader in one transaction."); item3.traderConfig.requiredGlobalKey = traderConfig("Trader Required Global Key", item3.Trade.RequiredGlobalKey ?? "", "Required global key to unlock " + englishName + " at the trader."); if (item3.traderConfig.trader.Value != 0) { PrefabManager.AddItemToTrader(item3.Prefab, item3.traderConfig.trader.Value, item3.traderConfig.price.Value, item3.traderConfig.stack.Value, item3.traderConfig.requiredGlobalKey.Value); } } else if (item3.Trade.Trader != 0) { PrefabManager.AddItemToTrader(item3.Prefab, item3.Trade.Trader, item3.Trade.Price, item3.Trade.Stack, item3.Trade.RequiredGlobalKey); } void SetDmg(string dmgType, Func readDmg, setDmgFunc setDmg) { statcfg(dmgType + " Damage", dmgType + " damage dealt by " + englishName + ".", (SharedData shared) => readDmg(shared.m_damages), delegate(SharedData shared, float val) { setDmg(ref shared.m_damages, val); }); statcfg(dmgType + " Damage Per Level", dmgType + " damage dealt increase per level for " + englishName + ".", (SharedData shared) => readDmg(shared.m_damagesPerLevel), delegate(SharedData shared, float val) { setDmg(ref shared.m_damagesPerLevel, val); }); } bool TraderBrowsability() { return item3.traderConfig.trader.Value != Trader.None; } void statcfg(string configName, string description, [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 1, 1, 0 })] Func readDefault, [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 1, 1, 0 })] Action setValue) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown SharedData shared3 = item3.Prefab.GetComponent().m_itemData.m_shared; ConfigEntry cfg2 = config(englishName, configName, readDefault(shared3), new ConfigDescription(description, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Stats) != 0) } })); if ((item3.configurationVisible & Configurability.Stats) != 0) { setValue(shared3, cfg2.Value); } item3.statsConfigs.Add((ConfigEntryBase)(object)cfg2, ApplyConfig); cfg2.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { if ((item3.configurationVisible & Configurability.Stats) != 0) { ApplyConfig(); } }; void ApplyConfig() { item3.ApplyToAllInstances(delegate(ItemData item) { setValue(item.m_shared, cfg2.Value); }); } } [return: <6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 1, 0 })] ConfigEntry traderConfig(string name, [<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(0)] T value, string desc) { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown ConfigurationManagerAttributes configurationManagerAttributes2 = new ConfigurationManagerAttributes { Order = (order -= 1), browsability = TraderBrowsability, Browsable = (TraderBrowsability() && (item3.configurationVisible & Configurability.Trader) != 0), Category = localizedName }; traderAttributes.Add(configurationManagerAttributes2); ConfigEntry obj = config(englishName, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes2 })); obj.SettingChanged += [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (object _, EventArgs _) => { item3.ReloadTraderConfiguration(); }; return obj; } } if (saveOnConfigSet) { plugin.Config.SaveOnConfigSet = true; plugin.Config.Save(); } } configManager = ((type == null) ? null : Chainloader.ManagerObject.GetComponent(type)); foreach (Item registeredItem in registeredItems) { Item item2 = registeredItem; foreach (KeyValuePair recipe in item2.Recipes) { KeyValuePair kv = recipe; RequiredResourceList[] array2 = new RequiredResourceList[2] { kv.Value.RequiredItems, kv.Value.RequiredUpgradeItems }; foreach (RequiredResourceList requiredResourceList in array2) { for (int l = 0; l < requiredResourceList.Requirements.Count; l++) { ConfigEntry amountCfg; int resourceIndex; if ((item2.configurability & Configurability.Recipe) != 0) { amountCfg = requiredResourceList.Requirements[l].amountConfig; if (amountCfg != null) { resourceIndex = l; amountCfg.SettingChanged += ConfigChanged; } } void ConfigChanged(object o, EventArgs e) { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && activeRecipes.ContainsKey(item2) && activeRecipes[item2].TryGetValue(kv.Key, out var value2)) { foreach (Recipe item11 in value2) { item11.m_resources[resourceIndex].m_amount = amountCfg.Value; } } } } } } item2.InitializeNewRegisteredItem(); } } private void InitializeNewRegisteredItem() { foreach (KeyValuePair recipe in Recipes) { KeyValuePair kv = recipe; ConfigEntryBase enabledCfg = kv.Value.RecipeIsActive; if (enabledCfg != null) { ((object)enabledCfg).GetType().GetEvent("SettingChanged").AddEventHandler(enabledCfg, new EventHandler(ConfigChanged)); } void ConfigChanged(object o, EventArgs e) { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && activeRecipes.ContainsKey(this) && activeRecipes[this].TryGetValue(kv.Key, out var value)) { foreach (Recipe item in value) { item.m_enabled = (int)enabledCfg.BoxedValue != 0; } } } } } public void ReloadCraftingConfiguration() { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && ObjectDB.instance.GetItemPrefab(StringExtensionMethods.GetStableHashCode(((Object)Prefab).name)) == null) { registerRecipesInObjectDB(ObjectDB.instance); ObjectDB.instance.m_items.Add(Prefab); ObjectDB.instance.m_itemByHash.Add(StringExtensionMethods.GetStableHashCode(((Object)Prefab).name), Prefab); ZNetScene.instance.m_prefabs.Add(Prefab); ZNetScene.instance.m_namedPrefabs.Add(StringExtensionMethods.GetStableHashCode(((Object)Prefab).name), Prefab); } foreach (string item in Recipes.Keys.DefaultIfEmpty("")) { if (Recipes.TryGetValue(item, out var value) && value.Crafting.Stations.Count > 0) { UpdateItemTableConfig(item, value.Crafting.Stations.First().Table, value.Crafting.Stations.First().custom ?? ""); UpdateCraftConfig(item, new SerializedRequirements(value.RequiredItems.Requirements), new SerializedRequirements(value.RequiredUpgradeItems.Requirements)); } } } private void ReloadTraderConfiguration() { if (traderConfig.trader.Value == Trader.None) { PrefabManager.RemoveItemFromTrader(Prefab); } else { PrefabManager.AddItemToTrader(Prefab, traderConfig.trader.Value, traderConfig.price.Value, traderConfig.stack.Value, traderConfig.requiredGlobalKey.Value); } } public static void ApplyToAllInstances(GameObject prefab, Action callback) { callback(prefab.GetComponent().m_itemData); string name = prefab.GetComponent().m_itemData.m_shared.m_name; Inventory[] source = (from c in Player.s_players.Select([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (Player p) => ((Humanoid)p).GetInventory()).Concat(from c in Object.FindObjectsOfType() select c.GetInventory()) where c != null select c).ToArray(); foreach (ItemData item in (from i in (from p in ObjectDB.instance.m_items select p.GetComponent() into c where Object.op_Implicit((Object)(object)c) && Object.op_Implicit((Object)(object)((Component)c).GetComponent()) select c).Concat(ItemDrop.s_instances) select i.m_itemData).Concat(source.SelectMany([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (Inventory i) => i.GetAllItems()))) { if (item.m_shared.m_name == name) { callback(item); } } } public void ApplyToAllInstances(Action callback) { ApplyToAllInstances(Prefab, callback); } [<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] [return: <6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(1)] private static string getInternalName(T value) where T : struct { return ((InternalName)typeof(T).GetMember(value.ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName; } private void registerRecipesInObjectDB(ObjectDB objectDB) { //IL_044e: Unknown result type (might be due to invalid IL or missing references) //IL_0453: Unknown result type (might be due to invalid IL or missing references) //IL_0486: Unknown result type (might be due to invalid IL or missing references) //IL_049c: Expected O, but got Unknown activeRecipes[this] = new Dictionary>(); itemCraftConfigs.TryGetValue(this, out var value); foreach (KeyValuePair recipe in Recipes) { List list = new List(); foreach (CraftingStationConfig station in recipe.Value.Crafting.Stations) { ItemConfig itemConfig = value?[recipe.Key]; Recipe val = ScriptableObject.CreateInstance(); string name = ((Object)Prefab).name; CraftingTable table = station.Table; ((Object)val).name = name + "_Recipe_" + table; val.m_amount = recipe.Value.CraftAmount; bool enabled; if (itemConfig != null) { enabled = itemConfig.table.Value != CraftingTable.Disabled; } else { ConfigEntryBase recipeIsActive = recipe.Value.RecipeIsActive; enabled = (int)(((recipeIsActive != null) ? recipeIsActive.BoxedValue : null) ?? ((object)1)) != 0; } val.m_enabled = enabled; val.m_item = Prefab.GetComponent(); val.m_resources = SerializedRequirements.toPieceReqs(objectDB, (itemConfig?.craft == null) ? new SerializedRequirements(recipe.Value.RequiredItems.Requirements) : new SerializedRequirements(itemConfig.craft.Value), (itemConfig?.upgrade == null) ? new SerializedRequirements(recipe.Value.RequiredUpgradeItems.Requirements) : new SerializedRequirements(itemConfig.upgrade.Value)); table = ((itemConfig == null || list.Count > 0) ? station.Table : itemConfig.table.Value); if ((uint)table <= 1u) { val.m_craftingStation = null; } else if (((itemConfig == null || list.Count > 0) ? station.Table : itemConfig.table.Value) == CraftingTable.Custom) { GameObject prefab = ZNetScene.instance.GetPrefab((itemConfig == null || list.Count > 0) ? station.custom : itemConfig.customTable.Value); if (prefab != null) { val.m_craftingStation = prefab.GetComponent(); } else { Debug.LogWarning((object)("Custom crafting station '" + ((itemConfig == null || list.Count > 0) ? station.custom : itemConfig.customTable.Value) + "' does not exist")); } } else { val.m_craftingStation = ZNetScene.instance.GetPrefab(getInternalName((itemConfig == null || list.Count > 0) ? station.Table : itemConfig.table.Value)).GetComponent(); } val.m_minStationLevel = ((itemConfig == null || list.Count > 0) ? station.level : itemConfig.tableLevel.Value); val.m_requireOnlyOneIngredient = ((itemConfig == null) ? recipe.Value.RequireOnlyOneIngredient : (itemConfig.requireOneIngredient.Value == Toggle.On)); val.m_qualityResultAmountMultiplier = itemConfig?.qualityResultAmountMultiplier.Value ?? recipe.Value.QualityResultAmountMultiplier; list.Add(val); RequiredResourceList requiredItems = recipe.Value.RequiredItems; if (requiredItems != null && !requiredItems.Free) { List requirements = requiredItems.Requirements; if (requirements != null && requirements.Count == 0) { hiddenCraftRecipes.Add(val, recipe.Value.RecipeIsActive); } } requiredItems = recipe.Value.RequiredUpgradeItems; if (requiredItems != null && !requiredItems.Free) { List requirements = requiredItems.Requirements; if (requirements != null && requirements.Count == 0) { hiddenUpgradeRecipes.Add(val, recipe.Value.RecipeIsActive); } } } activeRecipes[this].Add(recipe.Key, list); objectDB.m_recipes.AddRange(list); } conversions = new List(); for (int i = 0; i < Conversions.Count; i++) { Conversion conversion = Conversions[i]; conversions.Add(new ItemConversion { m_from = SerializedRequirements.fetchByName(ObjectDB.instance, conversion.config?.input.Value ?? conversion.Input), m_to = Prefab.GetComponent() }); ConversionPiece conversionPiece = conversion.config?.piece.Value ?? conversion.Piece; string text = null; if (conversionPiece != 0 && conversions[i].m_from != null) { text = ((conversionPiece != ConversionPiece.Custom) ? getInternalName(conversionPiece) : (conversion.config?.customPiece.Value ?? conversion.customPiece)); GameObject prefab2 = ZNetScene.instance.GetPrefab(text); Smelter val2 = ((prefab2 != null) ? prefab2.GetComponent() : null); if (val2 != null) { val2.m_conversion.Add(conversions[i]); } else { text = null; } } if (conversion.config != null) { conversion.config.activePiece = text; } } } [HarmonyPriority(0)] internal static void Patch_ObjectDBInit(ObjectDB __instance) { if ((Object)(object)__instance.GetItemPrefab("YagluthDrop") == (Object)null) { return; } hiddenCraftRecipes.Clear(); hiddenUpgradeRecipes.Clear(); foreach (Item registeredItem in registeredItems) { registeredItem.registerRecipesInObjectDB(__instance); } } internal static void Patch_TraderGetAvailableItems(Trader __instance, ref List __result) { string prefabName = Utils.GetPrefabName(((Component)__instance).gameObject); Trader trader2 = ((prefabName == "Haldor") ? Trader.Haldor : ((prefabName == "Hildir") ? Trader.Hildir : Trader.None)); Trader trader = trader2; __result.AddRange(from tuple in PrefabManager.CustomTradeItems.Values where (tuple.Item1 & trader) != 0 select tuple.Item2 into tradeItem where string.IsNullOrEmpty(tradeItem.m_requiredGlobalKey) || ZoneSystem.instance.GetGlobalKey(tradeItem.m_requiredGlobalKey) select tradeItem); } internal static void Patch_OnAddSmelterInput(ItemData item, bool __result) { if (__result) { ((Humanoid)Player.m_localPlayer).UnequipItem(item, true); } } internal static void Patch_MaximumRequiredStationLevel(Recipe __instance, ref int __result, int quality) { if (!itemDropMap.TryGetValue(__instance.m_item, out var value)) { return; } IEnumerable source; if (!itemCraftConfigs.TryGetValue(value, out var value2)) { source = Enumerable.Empty(); } else { CraftingStation currentCraftingStation = Player.m_localPlayer.GetCurrentCraftingStation(); if (currentCraftingStation != null) { string stationName = Utils.GetPrefabName(((Component)currentCraftingStation).gameObject); source = from c in value2.Where([<41e93f00-2e74-4fd5-b631-dd94b8162c31>NullableContext(0)] (KeyValuePair c) => { switch (c.Value.table.Value) { case CraftingTable.Disabled: case CraftingTable.Inventory: return false; case CraftingTable.Custom: return c.Value.customTable.Value == stationName; default: return getInternalName(c.Value.table.Value) == stationName; } }) select c.Value; } else { source = value2.Values; } } __result = Mathf.Min(Mathf.Max(1, __instance.m_minStationLevel) + (quality - 1), (from cfg in source where cfg.maximumTableLevel != null select cfg.maximumTableLevel.Value).DefaultIfEmpty(value.MaximumRequiredStationLevel).Max()); } internal static void Patch_GetAvailableRecipesPrefix([<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 2, 1, 1, 1, 2 })] ref Dictionary> __state) { if (__state == null) { __state = new Dictionary>(); } Dictionary dictionary; if (InventoryGui.instance.InCraftTab()) { dictionary = hiddenCraftRecipes; } else { if (!InventoryGui.instance.InUpradeTab()) { return; } dictionary = hiddenUpgradeRecipes; } foreach (Recipe key in dictionary.Keys) { key.m_enabled = false; } __state[Assembly.GetExecutingAssembly()] = dictionary; } internal static void Patch_GetAvailableRecipesFinalizer([<6d2be70d-6a71-4d4c-b860-b6543c200224>Nullable(new byte[] { 1, 1, 1, 1, 2 })] Dictionary> __state) { if (!__state.TryGetValue(Assembly.GetExecutingAssembly(), out var value)) { return; } foreach (KeyValuePair item in value) { Recipe key = item.Key; ConfigEntryBase value2 = item.Value; key.m_enabled = (int)(((value2 != null) ? value2.BoxedValue : null) ?? ((object)1)) != 0; } } internal static IEnumerable Transpile_SetupRequirementList(IEnumerable instructionsEnumerable, ILGenerator ilg) { //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Expected O, but got Unknown //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Expected O, but got Unknown //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Expected O, but got Unknown //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Expected O, but got Unknown //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Expected O, but got Unknown //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Expected O, but got Unknown //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: Expected O, but got Unknown //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Expected O, but got Unknown //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Expected O, but got Unknown //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Expected O, but got Unknown List list = instructionsEnumerable.ToList(); MethodInfo methodInfo = AccessTools.DeclaredMethod(typeof(InventoryGui), "SetupRequirement", (Type[])null, (Type[])null); CodeInstruction val = null; CodeInstruction val2 = null; LocalBuilder localBuilder = ilg.DeclareLocal(typeof(int)); Dictionary dictionary = new Dictionary(); bool flag = false; int num = 0; int value = 0; Label? label = default(Label?); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { val = list[i + 2]; val2 = list[i + 5]; flag = true; } if (flag) { if (CodeInstructionExtensions.Branches(list[i], ref label) && dictionary.TryGetValue(label.Value, out value)) { num = i; break; } continue; } foreach (Label label4 in list[i].labels) { dictionary[label4] = i; } } if (list[value - 3].opcode == OpCodes.Dup) { return list; } Label label2 = ilg.DefineLabel(); Label label3 = ilg.DefineLabel(); list[num + 1].labels.Add(label2); list.InsertRange(num + 1, (IEnumerable)(object)new CodeInstruction[11] { new CodeInstruction(OpCodes.Ldloc, (object)localBuilder), new CodeInstruction(OpCodes.Brfalse, (object)label2), val.Clone(), new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.DeclaredField(typeof(InventoryGui), "m_recipeRequirementList")), new CodeInstruction(OpCodes.Ldlen, (object)null), new CodeInstruction(OpCodes.Bgt, (object)label2), new CodeInstruction(OpCodes.Ldc_I4_0, (object)null), val2.Clone(), new CodeInstruction(OpCodes.Ldc_I4_0, (object)null), new CodeInstruction(OpCodes.Br, (object)label3) }); list.InsertRange(value - 2, (IEnumerable)(object)new CodeInstruction[2] { new CodeInstruction(OpCodes.Dup, (object)null) { labels = new List