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 BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using ItemManager; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using PieceManager; using ServerSync; using SoftReferenceableAssets; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("RavenHeim")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyProduct("RavenHeim")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("E74EB49A-461D-48EA-85BC-F462D60C98C4")] [assembly: AssemblyFileVersion("0.0.1")] [assembly: AssemblyCompany("Marlthon")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.1.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<884e53a8-3f2a-4da5-b47c-5b6cc1b23b5e>Embedded] internal sealed class <884e53a8-3f2a-4da5-b47c-5b6cc1b23b5e>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<884e53a8-3f2a-4da5-b47c-5b6cc1b23b5e>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [<884e53a8-3f2a-4da5-b47c-5b6cc1b23b5e>Embedded] [CompilerGenerated] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace PieceManager { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [NullableContext(1)] [PublicAPI] public static class MaterialReplacer { [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([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 } [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [NullableContext(1)] public class InternalName : Attribute { public readonly string internalName; public InternalName(string internalName) { this.internalName = internalName; } } [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [PublicAPI] [NullableContext(1)] 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; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] public string custom; } [PublicAPI] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [NullableContext(1)] 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; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] public string custom; } [PublicAPI] public enum BuildPieceCategory { Misc = 0, Crafting = 1, BuildingWorkbench = 2, BuildingStonecutter = 3, Furniture = 4, All = 100, Custom = 99 } [PublicAPI] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [NullableContext(1)] 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 { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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; } [NullableContext(1)] [PublicAPI] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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; } } [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [PublicAPI] [NullableContext(1)] public class PieceTool { public readonly HashSet Tools = new HashSet(); public void Add(string tool) { Tools.Add(tool); } } [NullableContext(1)] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [PublicAPI] public class BuildPiece { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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; } [NullableContext(0)] private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] [UsedImplicitly] public string Category; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(new byte[] { 2, 1 })] [UsedImplicitly] public Action CustomDrawer; } [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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([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([NullableContext(0)] (Requirement r) => $"{r.itemName}:{r.amount}:{r.recover}")); } [return: <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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)([NullableContext(0)] (Requirement r) => r.itemName), (Func)([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([NullableContext(0)] (Requirement v) => v != null).ToArray(); [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; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] [Description("Specifies a config entry which toggles whether a recipe is active.")] public ConfigEntryBase RecipeIsActive = null; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] private LocalizeKey _name; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] private LocalizeKey _description; internal string[] activeTools = null; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] private static object configManager; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] private static Localization _english; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] internal static BaseUnityPlugin _plugin = null; private static bool hasConfigSync = true; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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([NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); return _plugin; } } [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] private static object configSync { [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([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 += [NullableContext(0)] (object _, EventArgs _) => { Inventory[] source = (from c in Player.s_players.Select([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([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([NullableContext(0)] (IGrouping> g) => g.Key, [NullableContext(0)] (IGrouping> g) => g.Select([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 += [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 += [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 += [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); [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, [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, [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([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<[<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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<[<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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 { [NullableContext(1)] public static T GetOrAddComponent<[<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] T>(this GameObject gameObject) where T : Component { return gameObject.GetComponent() ?? gameObject.AddComponent(); } } [NullableContext(1)] [PublicAPI] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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)); } } } } [NullableContext(1)] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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([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([<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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; } } [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [NullableContext(1)] public class AdminSyncing { [CompilerGenerated] private sealed class <g__WatchAdminListChanges|2_0>d : IEnumerator, IDisposable, IEnumerator { private int <>1__state; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] private object <>2__current; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(new byte[] { 0, 1 })] private List 5__1; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(new byte[] { 0, 1 })] private List 5__2; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(new byte[] { 0, 1 })] private List 5__3; object IEnumerator.Current { [DebuggerHidden] [return: <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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 { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] public ZPackage package; [NullableContext(0)] internal IEnumerator b__1(ZNetPeer p) { return TellPeerAdminStatus(p, package); } } [StructLayout(LayoutKind.Auto)] [CompilerGenerated] private struct <>c__DisplayClass4_0 { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] public ZNetPeer peer; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] public ZRoutedRpc rpc; } [CompilerGenerated] private sealed class d__4 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private bool <>2__current; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] public ZNetPeer peer; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] public ZPackage package; private <>c__DisplayClass4_0 <>8__1; bool IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] private object <>2__current; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(new byte[] { 0, 1 })] public List peers; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] public ZPackage package; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] private <>c__DisplayClass3_0 <>8__1; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] private byte[] 5__2; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(new byte[] { 0, 1 })] private List> 5__3; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] private ZPackage 5__4; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] private MemoryStream 5__5; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] private DeflateStream 5__6; object IEnumerator.Current { [DebuggerHidden] [return: <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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 }); } } } [NullableContext(1)] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [HarmonyPatch(typeof(ZNet), "OnNewConnection")] 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); } } [NullableContext(1)] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] public static class PiecePrefabManager { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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)([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([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 { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(1)] public const string Version = "1.2.9"; } [PublicAPI] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [NullableContext(1)] public class Conversion { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] internal class ConversionConfig { public ConfigEntry input = null; public ConfigEntry output = null; } public string Input = null; public string Output = null; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] internal ConversionConfig config; public Conversion(BuildPiece conversionPiece) { conversionPiece.Conversions.Add(this); } } } namespace RavenHeim { [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [Obfuscation(Exclude = true, ApplyToMembers = true)] [RequireComponent(typeof(Collider))] [NullableContext(1)] public class BuildingZone : MonoBehaviour { public static List AllZones = new List(); private Collider m_collider; private void Awake() { m_collider = ((Component)this).GetComponent(); if ((Object)(object)m_collider != (Object)null) { m_collider.isTrigger = true; } } private void OnEnable() { if ((Object)(object)m_collider != (Object)null && !AllZones.Contains(m_collider)) { AllZones.Add(m_collider); } } private void OnDisable() { if ((Object)(object)m_collider != (Object)null) { AllZones.Remove(m_collider); } } } [NullableContext(1)] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] public static class BuildingZonePatch { private static bool _initialized = false; private static readonly HashSet _supportedInstances = new HashSet(); public static void Init(Harmony harmony) { if (!_initialized) { _initialized = true; harmony.PatchAll(typeof(BuildingZonePatch)); } } [HarmonyPrefix] [HarmonyPatch(typeof(WearNTear), "UpdateSupport")] public static bool WearNTear_UpdateSupport_Prefix(WearNTear __instance) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) if (BuildingZone.AllZones.Count == 0) { return true; } int instanceID = ((Object)__instance).GetInstanceID(); if (_supportedInstances.Contains(instanceID)) { __instance.m_supports = true; return false; } Vector3 position = ((Component)__instance).transform.position; foreach (Collider allZone in BuildingZone.AllZones) { if ((Object)(object)allZone != (Object)null) { Bounds bounds = allZone.bounds; if (((Bounds)(ref bounds)).Contains(position)) { __instance.m_supports = true; _supportedInstances.Add(instanceID); return false; } } } return true; } [HarmonyPrefix] [HarmonyPatch(typeof(WearNTear), "OnDestroy")] public static void WearNTear_OnDestroy_Prefix(WearNTear __instance) { _supportedInstances.Remove(((Object)__instance).GetInstanceID()); } [HarmonyPatch(typeof(Game), "SpawnPlayer")] [HarmonyPostfix] public static void Game_SpawnPlayer_Postfix() { _supportedInstances.Clear(); } [HarmonyPostfix] [HarmonyPatch(typeof(ZNetScene), "Shutdown")] public static void ZNetScene_Shutdown_Postfix() { _supportedInstances.Clear(); } } [NullableContext(1)] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [BepInPlugin("JamesJones.RavenHeim", "RavenHeim", "0.0.1")] public class RavenHeimPlugin : BaseUnityPlugin { [NullableContext(0)] private class ConfigurationManagerAttributes { public bool? Browsable = false; } internal const string ModName = "RavenHeim"; internal const string ModVersion = "0.0.1"; internal const string Author = "JamesJones"; private const string ModGUID = "JamesJones.RavenHeim"; private static string ConfigFileName = "JamesJones.RavenHeim.cfg"; private static string ConfigFileFullPath; private readonly Harmony _harmony = new Harmony("JamesJones.RavenHeim"); public static readonly ManualLogSource RavenHeim; private static readonly ConfigSync ConfigSync; public ConfigEntry maximumPlacementDistance; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] private static ConfigEntry _serverConfigLocked; public static ConfigEntry SuppressUnicodeNotFoundWarning { get; private set; } public void Awake() { _serverConfigLocked = config("General", "Force Server Config", value: true, "Force Server Config"); ConfigSync.AddLockingConfigEntry(_serverConfigLocked); maximumPlacementDistance = config("1 - Additional", "Build distance alteration", 5f, "Build Distance (Maximum Placement Distance)"); BuildingZonePatch.Init(_harmony); BuildPiece buildPiece = new BuildPiece("mar_ravenheim", "A2_D_Hut"); buildPiece.Category.Set("RavenHeim"); buildPiece.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece.Name.English("A2_D_Hut"); buildPiece.Name.Portuguese_Brazilian("A2_D_Hut"); buildPiece.Description.English("A2_D_Hut"); buildPiece.Description.Portuguese_Brazilian("A2_D_Hut"); buildPiece.RequiredItems.Add("Ravenwood", 10, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece2 = new BuildPiece("mar_ravenheim", "A2_Hut"); buildPiece2.Category.Set("RavenHeim"); buildPiece2.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece2.Name.English("A2_Hut"); buildPiece2.Name.Portuguese_Brazilian("A2_Hut"); buildPiece2.Description.English("A2_Hut"); buildPiece2.Description.Portuguese_Brazilian("A2_Hut"); buildPiece2.RequiredItems.Add("Ravenwood", 10, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece2.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece3 = new BuildPiece("mar_ravenheim", "A3_C_Hut"); buildPiece3.Category.Set("RavenHeim"); buildPiece3.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece3.Name.English("A3_C_Hut"); buildPiece3.Name.Portuguese_Brazilian("A3_C_Hut"); buildPiece3.Description.English("A3_C_Hut"); buildPiece3.Description.Portuguese_Brazilian("A3_C_Hut"); buildPiece3.RequiredItems.Add("Ravenwood", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece3.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece4 = new BuildPiece("mar_ravenheim", "A3_D_Hut"); buildPiece4.Category.Set("RavenHeim"); buildPiece4.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece4.Name.English("A3_D_Hut"); buildPiece4.Name.Portuguese_Brazilian("A3_D_Hut"); buildPiece4.Description.English("A3_D_Hut"); buildPiece4.Description.Portuguese_Brazilian("A3_D_Hut"); buildPiece4.RequiredItems.Add("Ravenwood", 15, recover: true); buildPiece4.RequiredItems.Add("RavenStone", 25, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece4.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece5 = new BuildPiece("mar_ravenheim", "A4_B_House"); buildPiece5.Category.Set("RavenHeim"); buildPiece5.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece5.Name.English("A4_B_House"); buildPiece5.Name.Portuguese_Brazilian("A4_B_House"); buildPiece5.Description.English("A4_B_House"); buildPiece5.Description.Portuguese_Brazilian("A4_B_House"); buildPiece5.RequiredItems.Add("Ravenwood", 15, recover: true); buildPiece5.RequiredItems.Add("RavenStone", 35, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece5.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece6 = new BuildPiece("mar_ravenheim", "A4_C_House"); buildPiece6.Category.Set("RavenHeim"); buildPiece6.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece6.Name.English("A4_C_House"); buildPiece6.Name.Portuguese_Brazilian("A4_C_House"); buildPiece6.Description.English("A4_C_House"); buildPiece6.Description.Portuguese_Brazilian("A4_C_House"); buildPiece6.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece6.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece7 = new BuildPiece("mar_ravenheim", "A5_B_House"); buildPiece7.Category.Set("RavenHeim"); buildPiece7.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece7.Name.English("A5_B_House"); buildPiece7.Name.Portuguese_Brazilian("A5_B_House"); buildPiece7.Description.English("A5_B_House"); buildPiece7.Description.Portuguese_Brazilian("A5_B_House"); buildPiece7.RequiredItems.Add("Ravenwood", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece7.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece8 = new BuildPiece("mar_ravenheim", "A5_C_House"); buildPiece8.Category.Set("RavenHeim"); buildPiece8.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece8.Name.English("A5_C_House"); buildPiece8.Name.Portuguese_Brazilian("A5_C_House"); buildPiece8.Description.English("A5_C_House"); buildPiece8.Description.Portuguese_Brazilian("A5_C_House"); buildPiece8.RequiredItems.Add("Ravenwood", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece8.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece9 = new BuildPiece("mar_ravenheim", "A5_D_House"); buildPiece9.Category.Set("RavenHeim"); buildPiece9.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece9.Name.English("A5_D_House"); buildPiece9.Name.Portuguese_Brazilian("A5_D_House"); buildPiece9.Description.English("A5_D_House"); buildPiece9.Description.Portuguese_Brazilian("A5_D_House"); buildPiece9.RequiredItems.Add("Ravenwood", 15, recover: true); buildPiece9.RequiredItems.Add("RavenStone", 35, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece9.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece10 = new BuildPiece("mar_ravenheim", "A6_B_House"); buildPiece10.Category.Set("RavenHeim"); buildPiece10.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece10.Name.English("A6_B_House"); buildPiece10.Name.Portuguese_Brazilian("A6_B_House"); buildPiece10.Description.English("A6_B_House"); buildPiece10.Description.Portuguese_Brazilian("A6_B_House"); buildPiece10.RequiredItems.Add("Ravenwood", 20, recover: true); buildPiece10.RequiredItems.Add("RavenStone", 40, recover: true); BuildPiece buildPiece11 = new BuildPiece("mar_ravenheim", "A6_C_House"); buildPiece11.Category.Set("RavenHeim"); buildPiece11.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece11.Name.English("A6_C_House"); buildPiece11.Name.Portuguese_Brazilian("A6_C_House"); buildPiece11.Description.English("A6_C_House"); buildPiece11.Description.Portuguese_Brazilian("A6_C_House"); buildPiece11.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece11.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece12 = new BuildPiece("mar_ravenheim", "A6_D_House"); buildPiece12.Category.Set("RavenHeim"); buildPiece12.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece12.Name.English("A6_D_House"); buildPiece12.Name.Portuguese_Brazilian("A6_D_House"); buildPiece12.Description.English("A6_D_House"); buildPiece12.Description.Portuguese_Brazilian("A6_D_House"); buildPiece12.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece12.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece13 = new BuildPiece("mar_ravenheim", "A7_B_House"); buildPiece13.Category.Set("RavenHeim"); buildPiece13.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece13.Name.English("A7_B_House"); buildPiece13.Name.Portuguese_Brazilian("A7_B_House"); buildPiece13.Description.English("A7_B_House"); buildPiece13.Description.Portuguese_Brazilian("A7_B_House"); buildPiece13.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece13.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece14 = new BuildPiece("mar_ravenheim", "A7_C_House"); buildPiece14.Category.Set("RavenHeim"); buildPiece14.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece14.Name.English("A7_C_House"); buildPiece14.Name.Portuguese_Brazilian("A7_C_House"); buildPiece14.Description.English("A7_C_House"); buildPiece14.Description.Portuguese_Brazilian("A7_C_House"); buildPiece14.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece14.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece15 = new BuildPiece("mar_ravenheim", "A7_D_House"); buildPiece15.Category.Set("RavenHeim"); buildPiece15.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece15.Name.English("A7_D_House"); buildPiece15.Name.Portuguese_Brazilian("A7_D_House"); buildPiece15.Description.English("A7_D_House"); buildPiece15.Description.Portuguese_Brazilian("A7_D_House"); buildPiece15.RequiredItems.Add("Ravenwood", 20, recover: true); buildPiece15.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece15.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece16 = new BuildPiece("mar_ravenheim", "A8_B_House"); buildPiece16.Category.Set("RavenHeim"); buildPiece16.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece16.Name.English("A8_B_House"); buildPiece16.Name.Portuguese_Brazilian("A8_B_House"); buildPiece16.Description.English("A8_B_House"); buildPiece16.Description.Portuguese_Brazilian("A8_B_House"); buildPiece16.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece16.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece17 = new BuildPiece("mar_ravenheim", "A8_C_House"); buildPiece17.Category.Set("RavenHeim"); buildPiece17.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece17.Name.English("A8_C_House"); buildPiece17.Name.Portuguese_Brazilian("A8_C_House"); buildPiece17.Description.English("A8_C_House"); buildPiece17.Description.Portuguese_Brazilian("A8_C_House"); buildPiece17.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece17.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece18 = new BuildPiece("mar_ravenheim", "A8_D_House"); buildPiece18.Category.Set("RavenHeim"); buildPiece18.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece18.Name.English("A8_D_House"); buildPiece18.Name.Portuguese_Brazilian("A8_D_House"); buildPiece18.Description.English("A8_D_House"); buildPiece18.Description.Portuguese_Brazilian("A8_D_House"); buildPiece18.RequiredItems.Add("Ravenwood", 20, recover: true); buildPiece18.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece18.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece19 = new BuildPiece("mar_ravenheim", "B1_B_Shop"); buildPiece19.Category.Set("RavenHeim"); buildPiece19.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece19.Name.English("B1_B_Shop"); buildPiece19.Name.Portuguese_Brazilian("B1_B_Shop"); buildPiece19.Description.English("B1_B_Shop"); buildPiece19.Description.Portuguese_Brazilian("B1_B_Shop"); buildPiece19.RequiredItems.Add("Ravenwood", 20, recover: true); buildPiece19.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece19.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece20 = new BuildPiece("mar_ravenheim", "B1_C_Shop"); buildPiece20.Category.Set("RavenHeim"); buildPiece20.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece20.Name.English("B1_C_Shop"); buildPiece20.Name.Portuguese_Brazilian("B1_C_Shop"); buildPiece20.Description.English("B1_C_Shop"); buildPiece20.Description.Portuguese_Brazilian("B1_C_Shop"); buildPiece20.RequiredItems.Add("Ravenwood", 20, recover: true); buildPiece20.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece20.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece21 = new BuildPiece("mar_ravenheim", "B1_D_Shop"); buildPiece21.Category.Set("RavenHeim"); buildPiece21.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece21.Name.English("B1_D_Shop"); buildPiece21.Name.Portuguese_Brazilian("B1_D_Shop"); buildPiece21.Description.English("B1_D_Shop"); buildPiece21.Description.Portuguese_Brazilian("B1_D_Shop"); buildPiece21.RequiredItems.Add("Ravenwood", 20, recover: true); buildPiece21.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece21.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece22 = new BuildPiece("mar_ravenheim", "B2_B_Shop"); buildPiece22.Category.Set("RavenHeim"); buildPiece22.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece22.Name.English("B2_B_Shop"); buildPiece22.Name.Portuguese_Brazilian("B2_B_Shop"); buildPiece22.Description.English("B2_B_Shop"); buildPiece22.Description.Portuguese_Brazilian("B2_B_Shop"); buildPiece22.RequiredItems.Add("Ravenwood", 30, recover: true); buildPiece22.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece22.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece23 = new BuildPiece("mar_ravenheim", "B2_C_Shop"); buildPiece23.Category.Set("RavenHeim"); buildPiece23.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece23.Name.English("B2_C_Shop"); buildPiece23.Name.Portuguese_Brazilian("B2_C_Shop"); buildPiece23.Description.English("B2_C_Shop"); buildPiece23.Description.Portuguese_Brazilian("B2_C_Shop"); buildPiece23.RequiredItems.Add("Ravenwood", 30, recover: true); buildPiece23.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece23.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece24 = new BuildPiece("mar_ravenheim", "B2_D_Shop"); buildPiece24.Category.Set("RavenHeim"); buildPiece24.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece24.Name.English("B2_D_Shop"); buildPiece24.Name.Portuguese_Brazilian("B2_D_Shop"); buildPiece24.Description.English("B2_D_Shop"); buildPiece24.Description.Portuguese_Brazilian("B2_D_Shop"); buildPiece24.RequiredItems.Add("Ravenwood", 30, recover: true); buildPiece24.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece24.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece25 = new BuildPiece("mar_ravenheim", "B3_B_Shop"); buildPiece25.Category.Set("RavenHeim"); buildPiece25.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece25.Name.English("B3_B_Shop"); buildPiece25.Name.Portuguese_Brazilian("B3_B_Shop"); buildPiece25.Description.English("B3_B_Shop"); buildPiece25.Description.Portuguese_Brazilian("B3_B_Shop"); buildPiece25.RequiredItems.Add("Ravenwood", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece25.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece26 = new BuildPiece("mar_ravenheim", "B3_C_Shop"); buildPiece26.Category.Set("RavenHeim"); buildPiece26.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece26.Name.English("B3_C_Shop"); buildPiece26.Name.Portuguese_Brazilian("B3_C_Shop"); buildPiece26.Description.English("B3_C_Shop"); buildPiece26.Description.Portuguese_Brazilian("B3_C_Shop"); buildPiece26.RequiredItems.Add("Ravenwood", 30, recover: true); buildPiece26.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece26.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece27 = new BuildPiece("mar_ravenheim", "B3_D_Shop"); buildPiece27.Category.Set("RavenHeim"); buildPiece27.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece27.Name.English("B3_D_Shop"); buildPiece27.Name.Portuguese_Brazilian("B3_D_Shop"); buildPiece27.Description.English("B3_D_Shop"); buildPiece27.Description.Portuguese_Brazilian("B3_D_Shop"); buildPiece27.RequiredItems.Add("Ravenwood", 30, recover: true); buildPiece27.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece27.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece28 = new BuildPiece("mar_ravenheim", "B4_B_Shop"); buildPiece28.Category.Set("RavenHeim"); buildPiece28.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece28.Name.English("B4_B_Shop"); buildPiece28.Name.Portuguese_Brazilian("B4_B_Shop"); buildPiece28.Description.English("B4_B_Shop"); buildPiece28.Description.Portuguese_Brazilian("B4_B_Shop"); buildPiece28.RequiredItems.Add("Ravenwood", 30, recover: true); buildPiece28.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece28.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece29 = new BuildPiece("mar_ravenheim", "B4_C_Shop"); buildPiece29.Category.Set("RavenHeim"); buildPiece29.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece29.Name.English("B4_C_Shop"); buildPiece29.Name.Portuguese_Brazilian("B4_C_Shop"); buildPiece29.Description.English("B4_C_Shop"); buildPiece29.Description.Portuguese_Brazilian("B4_C_Shop"); buildPiece29.RequiredItems.Add("Ravenwood", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece29.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece30 = new BuildPiece("mar_ravenheim", "B4_D_Shop"); buildPiece30.Category.Set("RavenHeim"); buildPiece30.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece30.Name.English("B4_D_Shop"); buildPiece30.Name.Portuguese_Brazilian("B4_D_Shop"); buildPiece30.Description.English("B4_D_Shop"); buildPiece30.Description.Portuguese_Brazilian("B4_D_Shop"); buildPiece30.RequiredItems.Add("Ravenwood", 30, recover: true); buildPiece30.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece30.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece31 = new BuildPiece("mar_ravenheim", "C1_A2_Apartment"); buildPiece31.Category.Set("RavenHeim"); buildPiece31.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece31.Name.English("C1_A2_Apartment"); buildPiece31.Name.Portuguese_Brazilian("C1_A2_Apartment"); buildPiece31.Description.English("C1_A2_Apartment"); buildPiece31.Description.Portuguese_Brazilian("C1_A2_Apartment"); buildPiece31.RequiredItems.Add("Ravenwood", 80, recover: true); buildPiece31.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece31.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece32 = new BuildPiece("mar_ravenheim", "C1_B2_Apartment"); buildPiece32.Category.Set("RavenHeim"); buildPiece32.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece32.Name.English("C1_B2_Apartment"); buildPiece32.Name.Portuguese_Brazilian("C1_B2_Apartment"); buildPiece32.Description.English("C1_B2_Apartment"); buildPiece32.Description.Portuguese_Brazilian("C1_B2_Apartment"); buildPiece32.RequiredItems.Add("Ravenwood", 80, recover: true); buildPiece32.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece32.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece33 = new BuildPiece("mar_ravenheim", "C2_A2_Apartment"); buildPiece33.Category.Set("RavenHeim"); buildPiece33.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece33.Name.English("C2_A2_Apartment"); buildPiece33.Name.Portuguese_Brazilian("C2_A2_Apartment"); buildPiece33.Description.English("C2_A2_Apartment"); buildPiece33.Description.Portuguese_Brazilian("C2_A2_Apartment"); buildPiece33.RequiredItems.Add("Ravenwood", 80, recover: true); buildPiece33.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece33.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece34 = new BuildPiece("mar_ravenheim", "C2_B2_Apartment"); buildPiece34.Category.Set("RavenHeim"); buildPiece34.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece34.Name.English("C2_B2_Apartment"); buildPiece34.Name.Portuguese_Brazilian("C2_B2_Apartment"); buildPiece34.Description.English("C2_B2_Apartment"); buildPiece34.Description.Portuguese_Brazilian("C2_B2_Apartment"); buildPiece34.RequiredItems.Add("Ravenwood", 80, recover: true); buildPiece34.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece34.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece35 = new BuildPiece("mar_ravenheim", "C4_A2_Apartment"); buildPiece35.Category.Set("RavenHeim"); buildPiece35.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece35.Name.English("C4_A2_Apartment"); buildPiece35.Name.Portuguese_Brazilian("C4_A2_Apartment"); buildPiece35.Description.English("C4_A2_Apartment"); buildPiece35.Description.Portuguese_Brazilian("C4_A2_Apartment"); buildPiece35.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece35.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece35.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece36 = new BuildPiece("mar_ravenheim", "C4_B2_Apartment"); buildPiece36.Category.Set("RavenHeim"); buildPiece36.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece36.Name.English("C4_B2_Apartment"); buildPiece36.Name.Portuguese_Brazilian("C4_B2_Apartment"); buildPiece36.Description.English("C4_B2_Apartment"); buildPiece36.Description.Portuguese_Brazilian("C4_B2_Apartment"); buildPiece36.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece36.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece36.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece37 = new BuildPiece("mar_ravenheim", "D1_B_2Story_Shop"); buildPiece37.Category.Set("RavenHeim"); buildPiece37.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece37.Name.English("D1_B_2Story_Shop"); buildPiece37.Name.Portuguese_Brazilian("D1_B_2Story_Shop"); buildPiece37.Description.English("D1_B_2Story_Shop"); buildPiece37.Description.Portuguese_Brazilian("D1_B_2Story_Shop"); buildPiece37.RequiredItems.Add("Ravenwood", 100, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece37.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece38 = new BuildPiece("mar_ravenheim", "D1_C_2Story_Shop"); buildPiece38.Category.Set("RavenHeim"); buildPiece38.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece38.Name.English("D1_C_2Story_Shop"); buildPiece38.Name.Portuguese_Brazilian("D1_C_2Story_Shop"); buildPiece38.Description.English("D1_C_2Story_Shop"); buildPiece38.Description.Portuguese_Brazilian("D1_C_2Story_Shop"); buildPiece38.RequiredItems.Add("Ravenwood", 100, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece38.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece39 = new BuildPiece("mar_ravenheim", "D1_D_2Story_Shop"); buildPiece39.Category.Set("RavenHeim"); buildPiece39.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece39.Name.English("D1_D_2Story_Shop"); buildPiece39.Name.Portuguese_Brazilian("D1_D_2Story_Shop"); buildPiece39.Description.English("D1_D_2Story_Shop"); buildPiece39.Description.Portuguese_Brazilian("D1_D_2Story_Shop"); buildPiece39.RequiredItems.Add("Ravenwood", 50, recover: true); buildPiece39.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece39.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece40 = new BuildPiece("mar_ravenheim", "D2_B_2Story_Shop"); buildPiece40.Category.Set("RavenHeim"); buildPiece40.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece40.Name.English("D2_B_2Story_Shop"); buildPiece40.Name.Portuguese_Brazilian("D2_B_2Story_Shop"); buildPiece40.Description.English("D2_B_2Story_Shop"); buildPiece40.Description.Portuguese_Brazilian("D2_B_2Story_Shop"); buildPiece40.RequiredItems.Add("Ravenwood", 70, recover: true); buildPiece40.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece40.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece41 = new BuildPiece("mar_ravenheim", "D2_C_2Story_Shop"); buildPiece41.Category.Set("RavenHeim"); buildPiece41.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece41.Name.English("D2_C_2Story_Shop"); buildPiece41.Name.Portuguese_Brazilian("D2_C_2Story_Shop"); buildPiece41.Description.English("D2_C_2Story_Shop"); buildPiece41.Description.Portuguese_Brazilian("D2_C_2Story_Shop"); buildPiece41.RequiredItems.Add("Ravenwood", 70, recover: true); buildPiece41.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece41.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece42 = new BuildPiece("mar_ravenheim", "D2_D_2Story_Shop"); buildPiece42.Category.Set("RavenHeim"); buildPiece42.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece42.Name.English("D2_D_2Story_Shop"); buildPiece42.Name.Portuguese_Brazilian("D2_D_2Story_Shop"); buildPiece42.Description.English("D2_D_2Story_Shop"); buildPiece42.Description.Portuguese_Brazilian("D2_D_2Story_Shop"); buildPiece42.RequiredItems.Add("Ravenwood", 70, recover: true); buildPiece42.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece42.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece43 = new BuildPiece("mar_ravenheim", "D3_B_2Story_House"); buildPiece43.Category.Set("RavenHeim"); buildPiece43.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece43.Name.English("D3_B_2Story_House"); buildPiece43.Name.Portuguese_Brazilian("D3_B_2Story_House"); buildPiece43.Description.English("D3_B_2Story_House"); buildPiece43.Description.Portuguese_Brazilian("D3_B_2Story_House"); buildPiece43.RequiredItems.Add("Ravenwood", 80, recover: true); buildPiece43.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece43.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece44 = new BuildPiece("mar_ravenheim", "D3_C_2Story_House"); buildPiece44.Category.Set("RavenHeim"); buildPiece44.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece44.Name.English("D3_C_2Story_House"); buildPiece44.Name.Portuguese_Brazilian("D3_C_2Story_House"); buildPiece44.Description.English("D3_C_2Story_House"); buildPiece44.Description.Portuguese_Brazilian("D3_C_2Story_House"); buildPiece44.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece44.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece45 = new BuildPiece("mar_ravenheim", "D3_D_2Story_House"); buildPiece45.Category.Set("RavenHeim"); buildPiece45.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece45.Name.English("D3_D_2Story_House"); buildPiece45.Name.Portuguese_Brazilian("D3_D_2Story_House"); buildPiece45.Description.English("D3_D_2Story_House"); buildPiece45.Description.Portuguese_Brazilian("D3_D_2Story_House"); buildPiece45.RequiredItems.Add("Ravenwood", 80, recover: true); buildPiece45.RequiredItems.Add("RavenStone", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece45.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece46 = new BuildPiece("mar_ravenheim", "D4_B_2Story_Shop"); buildPiece46.Category.Set("RavenHeim"); buildPiece46.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece46.Name.English("D4_B_2Story_Shop"); buildPiece46.Name.Portuguese_Brazilian("D4_B_2Story_Shop"); buildPiece46.Description.English("D4_B_2Story_Shop"); buildPiece46.Description.Portuguese_Brazilian("D4_B_2Story_Shop"); buildPiece46.RequiredItems.Add("Ravenwood", 70, recover: true); buildPiece46.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece46.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece47 = new BuildPiece("mar_ravenheim", "D4_C_2Story_Shop"); buildPiece47.Category.Set("RavenHeim"); buildPiece47.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece47.Name.English("D4_C_2Story_Shop"); buildPiece47.Name.Portuguese_Brazilian("D4_C_2Story_Shop"); buildPiece47.Description.English("D4_C_2Story_Shop"); buildPiece47.Description.Portuguese_Brazilian("D4_C_2Story_Shop"); buildPiece47.RequiredItems.Add("Ravenwood", 70, recover: true); buildPiece47.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece47.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece48 = new BuildPiece("mar_ravenheim", "E1_B_3Story_House"); buildPiece48.Category.Set("RavenHeim"); buildPiece48.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece48.Name.English("E1_B_3Story_House"); buildPiece48.Name.Portuguese_Brazilian("E1_B_3Story_House"); buildPiece48.Description.English("E1_B_3Story_House"); buildPiece48.Description.Portuguese_Brazilian("E1_B_3Story_House"); buildPiece48.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece48.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece48.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece49 = new BuildPiece("mar_ravenheim", "E1_C_3Story_House"); buildPiece49.Category.Set("RavenHeim"); buildPiece49.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece49.Name.English("E1_C_3Story_House"); buildPiece49.Name.Portuguese_Brazilian("E1_C_3Story_House"); buildPiece49.Description.English("E1_C_3Story_House"); buildPiece49.Description.Portuguese_Brazilian("E1_C_3Story_House"); buildPiece49.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece49.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece49.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece50 = new BuildPiece("mar_ravenheim", "E1_D_3Story_House"); buildPiece50.Category.Set("RavenHeim"); buildPiece50.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece50.Name.English("E1_D_3Story_House"); buildPiece50.Name.Portuguese_Brazilian("E1_D_3Story_House"); buildPiece50.Description.English("E1_D_3Story_House"); buildPiece50.Description.Portuguese_Brazilian("E1_D_3Story_House"); buildPiece50.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece50.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece50.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece51 = new BuildPiece("mar_ravenheim", "E2_B_3Story_House"); buildPiece51.Category.Set("RavenHeim"); buildPiece51.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece51.Name.English("E2_B_3Story_House"); buildPiece51.Name.Portuguese_Brazilian("E2_B_3Story_House"); buildPiece51.Description.English("E2_B_3Story_House"); buildPiece51.Description.Portuguese_Brazilian("E2_B_3Story_House"); buildPiece51.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece51.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece51.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece52 = new BuildPiece("mar_ravenheim", "E2_C_3Story_House"); buildPiece52.Category.Set("RavenHeim"); buildPiece52.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece52.Name.English("E2_C_3Story_House"); buildPiece52.Name.Portuguese_Brazilian("E2_C_3Story_House"); buildPiece52.Description.English("E2_C_3Story_House"); buildPiece52.Description.Portuguese_Brazilian("E2_C_3Story_House"); buildPiece52.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece52.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece52.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece53 = new BuildPiece("mar_ravenheim", "E2_D_3Story_House"); buildPiece53.Category.Set("RavenHeim"); buildPiece53.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece53.Name.English("E2_D_3Story_House"); buildPiece53.Name.Portuguese_Brazilian("E2_D_3Story_House"); buildPiece53.Description.English("E2_D_3Story_House"); buildPiece53.Description.Portuguese_Brazilian("E2_D_3Story_House"); buildPiece53.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece53.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece53.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece54 = new BuildPiece("mar_ravenheim", "E3_B_3Story_House"); buildPiece54.Category.Set("RavenHeim"); buildPiece54.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece54.Name.English("E3_B_3Story_House"); buildPiece54.Name.Portuguese_Brazilian("E3_B_3Story_House"); buildPiece54.Description.English("E3_B_3Story_House"); buildPiece54.Description.Portuguese_Brazilian("E3_B_3Story_House"); buildPiece54.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece54.RequiredItems.Add("RavenStone", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece54.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece55 = new BuildPiece("mar_ravenheim", "E3_C_3Story_House"); buildPiece55.Category.Set("RavenHeim"); buildPiece55.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece55.Name.English("E3_C_3Story_House"); buildPiece55.Name.Portuguese_Brazilian("E3_C_3Story_House"); buildPiece55.Description.English("E3_C_3Story_House"); buildPiece55.Description.Portuguese_Brazilian("E3_C_3Story_House"); buildPiece55.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece55.RequiredItems.Add("RavenStone", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece55.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece56 = new BuildPiece("mar_ravenheim", "E3_D_3Story_House"); buildPiece56.Category.Set("RavenHeim"); buildPiece56.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece56.Name.English("E3_D_3Story_House"); buildPiece56.Name.Portuguese_Brazilian("E3_D_3Story_House"); buildPiece56.Description.English("E3_D_3Story_House"); buildPiece56.Description.Portuguese_Brazilian("E3_D_3Story_House"); buildPiece56.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece56.RequiredItems.Add("RavenStone", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece56.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece57 = new BuildPiece("mar_ravenheim", "E4_A_3Story_house"); buildPiece57.Category.Set("RavenHeim"); buildPiece57.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece57.Name.English("E4_A_3Story_house"); buildPiece57.Name.Portuguese_Brazilian("E4_A_3Story_house"); buildPiece57.Description.English("E4_A_3Story_house"); buildPiece57.Description.Portuguese_Brazilian("E4_A_3Story_house"); buildPiece57.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece57.RequiredItems.Add("RavenStone", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece57.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece58 = new BuildPiece("mar_ravenheim", "E4_B_3Story_house"); buildPiece58.Category.Set("RavenHeim"); buildPiece58.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece58.Name.English("E4_B_3Story_house"); buildPiece58.Name.Portuguese_Brazilian("E4_B_3Story_house"); buildPiece58.Description.English("E4_B_3Story_house"); buildPiece58.Description.Portuguese_Brazilian("E4_B_3Story_house"); buildPiece58.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece58.RequiredItems.Add("RavenStone", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece58.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece59 = new BuildPiece("mar_ravenheim", "E4_C_3Story_house"); buildPiece59.Category.Set("RavenHeim"); buildPiece59.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece59.Name.English("E4_C_3Story_house"); buildPiece59.Name.Portuguese_Brazilian("E4_C_3Story_house"); buildPiece59.Description.English("E4_C_3Story_house"); buildPiece59.Description.Portuguese_Brazilian("E4_C_3Story_house"); buildPiece59.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece59.RequiredItems.Add("RavenStone", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece59.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece60 = new BuildPiece("mar_ravenheim", "E4_D_3Story_house"); buildPiece60.Category.Set("RavenHeim"); buildPiece60.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece60.Name.English("E4_D_3Story_house"); buildPiece60.Name.Portuguese_Brazilian("E4_D_3Story_house"); buildPiece60.Description.English("E4_D_3Story_house"); buildPiece60.Description.Portuguese_Brazilian("E4_D_3Story_house"); buildPiece60.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece60.RequiredItems.Add("RavenStone", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece60.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece61 = new BuildPiece("mar_ravenheim", "E5_A_3Story_House"); buildPiece61.Category.Set("RavenHeim"); buildPiece61.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece61.Name.English("E5_A_3Story_House"); buildPiece61.Name.Portuguese_Brazilian("E5_A_3Story_House"); buildPiece61.Description.English("E5_A_3Story_House"); buildPiece61.Description.Portuguese_Brazilian("E5_A_3Story_House"); buildPiece61.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece61.RequiredItems.Add("RavenStone", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece61.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece62 = new BuildPiece("mar_ravenheim", "E5_B_3Story_House"); buildPiece62.Category.Set("RavenHeim"); buildPiece62.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece62.Name.English("E5_B_3Story_House"); buildPiece62.Name.Portuguese_Brazilian("E5_B_3Story_House"); buildPiece62.Description.English("E5_B_3Story_House"); buildPiece62.Description.Portuguese_Brazilian("E5_B_3Story_House"); buildPiece62.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece62.RequiredItems.Add("RavenStone", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece62.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece63 = new BuildPiece("mar_ravenheim", "E5_C_3Story_house"); buildPiece63.Category.Set("RavenHeim"); buildPiece63.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece63.Name.English("E5_C_3Story_house"); buildPiece63.Name.Portuguese_Brazilian("E5_C_3Story_house"); buildPiece63.Description.English("E5_C_3Story_house"); buildPiece63.Description.Portuguese_Brazilian("E5_C_3Story_house"); buildPiece63.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece63.RequiredItems.Add("RavenStone", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece63.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece64 = new BuildPiece("mar_ravenheim", "E5_D_3Story_House"); buildPiece64.Category.Set("RavenHeim"); buildPiece64.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece64.Name.English("E5_D_3Story_House"); buildPiece64.Name.Portuguese_Brazilian("E5_D_3Story_House"); buildPiece64.Description.English("E5_D_3Story_House"); buildPiece64.Description.Portuguese_Brazilian("E5_D_3Story_House"); buildPiece64.RequiredItems.Add("Ravenwood", 120, recover: true); buildPiece64.RequiredItems.Add("RavenStone", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece64.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece65 = new BuildPiece("mar_ravenheim", "E6_B_3Story_Shop"); buildPiece65.Category.Set("RavenHeim"); buildPiece65.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece65.Name.English("E6_B_3Story_Shop"); buildPiece65.Name.Portuguese_Brazilian("E6_B_3Story_Shop"); buildPiece65.Description.English("E6_B_3Story_Shop"); buildPiece65.Description.Portuguese_Brazilian("E6_B_3Story_Shop"); buildPiece65.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece65.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece65.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece66 = new BuildPiece("mar_ravenheim", "E6_C_3Story_Shop"); buildPiece66.Category.Set("RavenHeim"); buildPiece66.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece66.Name.English("E6_C_3Story_Shop"); buildPiece66.Name.Portuguese_Brazilian("E6_C_3Story_Shop"); buildPiece66.Description.English("E6_C_3Story_Shop"); buildPiece66.Description.Portuguese_Brazilian("E6_C_3Story_Shop"); buildPiece66.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece66.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece66.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece67 = new BuildPiece("mar_ravenheim", "E6_D_3Story_Shop"); buildPiece67.Category.Set("RavenHeim"); buildPiece67.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece67.Name.English("E6_D_3Story_Shop"); buildPiece67.Name.Portuguese_Brazilian("E6_D_3Story_Shop"); buildPiece67.Description.English("E6_D_3Story_Shop"); buildPiece67.Description.Portuguese_Brazilian("E6_D_3Story_Shop"); buildPiece67.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece67.RequiredItems.Add("RavenStone", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece67.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece68 = new BuildPiece("mar_ravenheim", "F1_B_4Story_Inn"); buildPiece68.Category.Set("RavenHeim"); buildPiece68.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece68.Name.English("F1_B_4Story_Inn"); buildPiece68.Name.Portuguese_Brazilian("F1_B_4Story_Inn"); buildPiece68.Description.English("F1_B_4Story_Inn"); buildPiece68.Description.Portuguese_Brazilian("F1_B_4Story_Inn"); buildPiece68.RequiredItems.Add("Ravenwood", 170, recover: true); buildPiece68.RequiredItems.Add("RavenStone", 70, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece68.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece69 = new BuildPiece("mar_ravenheim", "F2_B_4Story_Tavern"); buildPiece69.Category.Set("RavenHeim"); buildPiece69.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece69.Name.English("F2_B_4Story_Tavern"); buildPiece69.Name.Portuguese_Brazilian("F2_B_4Story_Tavern"); buildPiece69.Description.English("F2_B_4Story_Tavern"); buildPiece69.Description.Portuguese_Brazilian("F2_B_4Story_Tavern"); buildPiece69.RequiredItems.Add("Ravenwood", 170, recover: true); buildPiece69.RequiredItems.Add("RavenStone", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece69.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece70 = new BuildPiece("mar_ravenheim", "F2_C_4Story_Tavern"); buildPiece70.Category.Set("RavenHeim"); buildPiece70.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece70.Name.English("F2_C_4Story_Tavern"); buildPiece70.Name.Portuguese_Brazilian("F2_C_4Story_Tavern"); buildPiece70.Description.English("F2_C_4Story_Tavern"); buildPiece70.Description.Portuguese_Brazilian("F2_C_4Story_Tavern"); buildPiece70.RequiredItems.Add("Ravenwood", 170, recover: true); buildPiece70.RequiredItems.Add("RavenStone", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece70.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece71 = new BuildPiece("mar_ravenheim", "F2_D_4Story_Tavern"); buildPiece71.Category.Set("RavenHeim"); buildPiece71.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece71.Name.English("F2_D_4Story_Tavern"); buildPiece71.Name.Portuguese_Brazilian("F2_D_4Story_Tavern"); buildPiece71.Description.English("F2_D_4Story_Tavern"); buildPiece71.Description.Portuguese_Brazilian("F2_D_4Story_Tavern"); buildPiece71.RequiredItems.Add("Ravenwood", 170, recover: true); buildPiece71.RequiredItems.Add("RavenStone", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece71.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece72 = new BuildPiece("mar_ravenheim", "F3_B_4Story_Inn"); buildPiece72.Category.Set("RavenHeim"); buildPiece72.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece72.Name.English("F3_B_4Story_Inn"); buildPiece72.Name.Portuguese_Brazilian("F3_B_4Story_Inn"); buildPiece72.Description.English("F3_B_4Story_Inn"); buildPiece72.Description.Portuguese_Brazilian("F3_B_4Story_Inn"); buildPiece72.RequiredItems.Add("Ravenwood", 160, recover: true); buildPiece72.RequiredItems.Add("RavenStone", 100, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece72.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece73 = new BuildPiece("mar_ravenheim", "MH_A2_C_Hut"); buildPiece73.Category.Set("RavenHeim"); buildPiece73.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece73.Name.English("MH_A2_C_Hut"); buildPiece73.Name.Portuguese_Brazilian("MH_A2_C_Hut"); buildPiece73.Description.English("MH_A2_C_Hut"); buildPiece73.Description.Portuguese_Brazilian("MH_A2_C_Hut"); buildPiece73.RequiredItems.Add("Ravenwood", 10, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece73.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece74 = new BuildPiece("mar_ravenheim", "MH_A3_Hut"); buildPiece74.Category.Set("RavenHeim"); buildPiece74.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece74.Name.English("MH_A3_Hut"); buildPiece74.Name.Portuguese_Brazilian("MH_A3_Hut"); buildPiece74.Description.English("MH_A3_Hut"); buildPiece74.Description.Portuguese_Brazilian("MH_A3_Hut"); buildPiece74.RequiredItems.Add("Ravenwood", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece74.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece75 = new BuildPiece("mar_ravenheim", "MH_A4_A_House"); buildPiece75.Category.Set("RavenHeim"); buildPiece75.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece75.Name.English("MH_A4_A_House"); buildPiece75.Name.Portuguese_Brazilian("MH_A4_A_House"); buildPiece75.Description.English("MH_A4_A_House"); buildPiece75.Description.Portuguese_Brazilian("MH_A4_A_House"); buildPiece75.RequiredItems.Add("Ravenwood", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece75.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece76 = new BuildPiece("mar_ravenheim", "MH_A5_A_House"); buildPiece76.Category.Set("RavenHeim"); buildPiece76.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece76.Name.English("MH_A5_A_House"); buildPiece76.Name.Portuguese_Brazilian("MH_A5_A_House"); buildPiece76.Description.English("MH_A5_A_House"); buildPiece76.Description.Portuguese_Brazilian("MH_A5_A_House"); buildPiece76.RequiredItems.Add("Ravenwood", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece76.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece77 = new BuildPiece("mar_ravenheim", "MH_A6_A_House"); buildPiece77.Category.Set("RavenHeim"); buildPiece77.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece77.Name.English("MH_A6_A_House"); buildPiece77.Name.Portuguese_Brazilian("MH_A6_A_House"); buildPiece77.Description.English("MH_A6_A_House"); buildPiece77.Description.Portuguese_Brazilian("MH_A6_A_House"); buildPiece77.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece77.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece78 = new BuildPiece("mar_ravenheim", "MH_A7_A_House"); buildPiece78.Category.Set("RavenHeim"); buildPiece78.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece78.Name.English("MH_A7_A_House"); buildPiece78.Name.Portuguese_Brazilian("MH_A7_A_House"); buildPiece78.Description.English("MH_A7_A_House"); buildPiece78.Description.Portuguese_Brazilian("MH_A7_A_House"); buildPiece78.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece78.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece79 = new BuildPiece("mar_ravenheim", "MH_A8_A_House"); buildPiece79.Category.Set("RavenHeim"); buildPiece79.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece79.Name.English("MH_A8_A_House"); buildPiece79.Name.Portuguese_Brazilian("MH_A8_A_House"); buildPiece79.Description.English("MH_A8_A_House"); buildPiece79.Description.Portuguese_Brazilian("MH_A8_A_House"); buildPiece79.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece79.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece80 = new BuildPiece("mar_ravenheim", "MH_B1_A_Shop"); buildPiece80.Category.Set("RavenHeim"); buildPiece80.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece80.Name.English("MH_B1_A_Shop"); buildPiece80.Name.Portuguese_Brazilian("MH_B1_A_Shop"); buildPiece80.Description.English("MH_B1_A_Shop"); buildPiece80.Description.Portuguese_Brazilian("MH_B1_A_Shop"); buildPiece80.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece80.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece81 = new BuildPiece("mar_ravenheim", "MH_B1_House"); buildPiece81.Category.Set("RavenHeim"); buildPiece81.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece81.Name.English("MH_B1_House"); buildPiece81.Name.Portuguese_Brazilian("MH_B1_House"); buildPiece81.Description.English("MH_B1_House"); buildPiece81.Description.Portuguese_Brazilian("MH_B1_House"); buildPiece81.RequiredItems.Add("Ravenwood", 40, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece81.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece82 = new BuildPiece("mar_ravenheim", "MH_B2_A_Shop"); buildPiece82.Category.Set("RavenHeim"); buildPiece82.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece82.Name.English("MH_B2_A_Shop"); buildPiece82.Name.Portuguese_Brazilian("MH_B2_A_Shop"); buildPiece82.Description.English("MH_B2_A_Shop"); buildPiece82.Description.Portuguese_Brazilian("MH_B2_A_Shop"); buildPiece82.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece82.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece83 = new BuildPiece("mar_ravenheim", "MH_B2_House"); buildPiece83.Category.Set("RavenHeim"); buildPiece83.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece83.Name.English("MH_B2_House"); buildPiece83.Name.Portuguese_Brazilian("MH_B2_House"); buildPiece83.Description.English("MH_B2_House"); buildPiece83.Description.Portuguese_Brazilian("MH_B2_House"); buildPiece83.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece83.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece84 = new BuildPiece("mar_ravenheim", "MH_B3_A_Shop"); buildPiece84.Category.Set("RavenHeim"); buildPiece84.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece84.Name.English("MH_B3_A_Shop"); buildPiece84.Name.Portuguese_Brazilian("MH_B3_A_Shop"); buildPiece84.Description.English("MH_B3_A_Shop"); buildPiece84.Description.Portuguese_Brazilian("MH_B3_A_Shop"); buildPiece84.RequiredItems.Add("Ravenwood", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece84.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece85 = new BuildPiece("mar_ravenheim", "MH_B3_House"); buildPiece85.Category.Set("RavenHeim"); buildPiece85.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece85.Name.English("MH_B3_House"); buildPiece85.Name.Portuguese_Brazilian("MH_B3_House"); buildPiece85.Description.English("MH_B3_House"); buildPiece85.Description.Portuguese_Brazilian("MH_B3_House"); buildPiece85.RequiredItems.Add("Ravenwood", 50, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece85.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece86 = new BuildPiece("mar_ravenheim", "MH_B4_A_Shop"); buildPiece86.Category.Set("RavenHeim"); buildPiece86.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece86.Name.English("MH_B4_A_Shop"); buildPiece86.Name.Portuguese_Brazilian("MH_B4_A_Shop"); buildPiece86.Description.English("MH_B4_A_Shop"); buildPiece86.Description.Portuguese_Brazilian("MH_B4_A_Shop"); buildPiece86.RequiredItems.Add("Ravenwood", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece86.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece87 = new BuildPiece("mar_ravenheim", "MH_B4_House"); buildPiece87.Category.Set("RavenHeim"); buildPiece87.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece87.Name.English("MH_B4_House"); buildPiece87.Name.Portuguese_Brazilian("MH_B4_House"); buildPiece87.Description.English("MH_B4_House"); buildPiece87.Description.Portuguese_Brazilian("MH_B4_House"); buildPiece87.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece87.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece88 = new BuildPiece("mar_ravenheim", "MH_B5_House"); buildPiece88.Category.Set("RavenHeim"); buildPiece88.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece88.Name.English("MH_B5_House"); buildPiece88.Name.Portuguese_Brazilian("MH_B5_House"); buildPiece88.Description.English("MH_B5_House"); buildPiece88.Description.Portuguese_Brazilian("MH_B5_House"); buildPiece88.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece88.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece89 = new BuildPiece("mar_ravenheim", "MH_C1_A1_Apartment"); buildPiece89.Category.Set("RavenHeim"); buildPiece89.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece89.Name.English("MH_C1_A1_Apartment"); buildPiece89.Name.Portuguese_Brazilian("MH_C1_A1_Apartment"); buildPiece89.Description.English("MH_C1_A1_Apartment"); buildPiece89.Description.Portuguese_Brazilian("MH_C1_A1_Apartment"); buildPiece89.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece89.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece90 = new BuildPiece("mar_ravenheim", "MH_C1_B1_Apartment"); buildPiece90.Category.Set("RavenHeim"); buildPiece90.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece90.Name.English("MH_C1_B1_Apartment"); buildPiece90.Name.Portuguese_Brazilian("MH_C1_B1_Apartment"); buildPiece90.Description.English("MH_C1_B1_Apartment"); buildPiece90.Description.Portuguese_Brazilian("MH_C1_B1_Apartment"); buildPiece90.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece90.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece91 = new BuildPiece("mar_ravenheim", "MH_C1_Shop"); buildPiece91.Category.Set("RavenHeim"); buildPiece91.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece91.Name.English("MH_C1_Shop"); buildPiece91.Name.Portuguese_Brazilian("MH_C1_Shop"); buildPiece91.Description.English("MH_C1_Shop"); buildPiece91.Description.Portuguese_Brazilian("MH_C1_Shop"); buildPiece91.RequiredItems.Add("Ravenwood", 60, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece91.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece92 = new BuildPiece("mar_ravenheim", "MH_C2_A1_Apartment"); buildPiece92.Category.Set("RavenHeim"); buildPiece92.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece92.Name.English("MH_C2_A1_Apartment"); buildPiece92.Name.Portuguese_Brazilian("MH_C2_A1_Apartment"); buildPiece92.Description.English("MH_C2_A1_Apartment"); buildPiece92.Description.Portuguese_Brazilian("MH_C2_A1_Apartment"); buildPiece92.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece92.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece93 = new BuildPiece("mar_ravenheim", "MH_C2_B1_Apartment"); buildPiece93.Category.Set("RavenHeim"); buildPiece93.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece93.Name.English("MH_C2_B1_Apartment"); buildPiece93.Name.Portuguese_Brazilian("MH_C2_B1_Apartment"); buildPiece93.Description.English("MH_C2_B1_Apartment"); buildPiece93.Description.Portuguese_Brazilian("MH_C2_B1_Apartment"); buildPiece93.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece93.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece94 = new BuildPiece("mar_ravenheim", "MH_C2_Shop"); buildPiece94.Category.Set("RavenHeim"); buildPiece94.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece94.Name.English("MH_C2_Shop"); buildPiece94.Name.Portuguese_Brazilian("MH_C2_Shop"); buildPiece94.Description.English("MH_C2_Shop"); buildPiece94.Description.Portuguese_Brazilian("MH_C2_Shop"); buildPiece94.RequiredItems.Add("Ravenwood", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece94.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece95 = new BuildPiece("mar_ravenheim", "MH_C3_Shop"); buildPiece95.Category.Set("RavenHeim"); buildPiece95.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece95.Name.English("MH_C3_Shop"); buildPiece95.Name.Portuguese_Brazilian("MH_C3_Shop"); buildPiece95.Description.English("MH_C3_Shop"); buildPiece95.Description.Portuguese_Brazilian("MH_C3_Shop"); buildPiece95.RequiredItems.Add("Ravenwood", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece95.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece96 = new BuildPiece("mar_ravenheim", "MH_C4_Shop"); buildPiece96.Category.Set("RavenHeim"); buildPiece96.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece96.Name.English("MH_C4_Shop"); buildPiece96.Name.Portuguese_Brazilian("MH_C4_Shop"); buildPiece96.Description.English("MH_C4_Shop"); buildPiece96.Description.Portuguese_Brazilian("MH_C4_Shop"); buildPiece96.RequiredItems.Add("Ravenwood", 80, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece96.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece97 = new BuildPiece("mar_ravenheim", "MH_D1_A_2Story_Shop"); buildPiece97.Category.Set("RavenHeim"); buildPiece97.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece97.Name.English("MH_D1_A_2Story_Shop"); buildPiece97.Name.Portuguese_Brazilian("MH_D1_A_2Story_Shop"); buildPiece97.Description.English("MH_D1_A_2Story_Shop"); buildPiece97.Description.Portuguese_Brazilian("MH_D1_A_2Story_Shop"); buildPiece97.RequiredItems.Add("Ravenwood", 100, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece97.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece98 = new BuildPiece("mar_ravenheim", "MH_D2_A_2Story_Shop"); buildPiece98.Category.Set("RavenHeim"); buildPiece98.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece98.Name.English("MH_D2_A_2Story_Shop"); buildPiece98.Name.Portuguese_Brazilian("MH_D2_A_2Story_Shop"); buildPiece98.Description.English("MH_D2_A_2Story_Shop"); buildPiece98.Description.Portuguese_Brazilian("MH_D2_A_2Story_Shop"); buildPiece98.RequiredItems.Add("Ravenwood", 100, recover: true); buildPiece98.RequiredItems.Add("RavenStone", 20, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece98.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece99 = new BuildPiece("mar_ravenheim", "MH_D2_Apartment"); buildPiece99.Category.Set("RavenHeim"); buildPiece99.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece99.Name.English("MH_D2_Apartment"); buildPiece99.Name.Portuguese_Brazilian("MH_D2_Apartment"); buildPiece99.Description.English("MH_D2_Apartment"); buildPiece99.Description.Portuguese_Brazilian("MH_D2_Apartment"); buildPiece99.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece99.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece100 = new BuildPiece("mar_ravenheim", "MH_D3_A_2Story_House"); buildPiece100.Category.Set("RavenHeim"); buildPiece100.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece100.Name.English("MH_D3_A_2Story_House"); buildPiece100.Name.Portuguese_Brazilian("MH_D3_A_2Story_House"); buildPiece100.Description.English("MH_D3_A_2Story_House"); buildPiece100.Description.Portuguese_Brazilian("MH_D3_A_2Story_House"); buildPiece100.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece100.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece101 = new BuildPiece("mar_ravenheim", "MH_D3_Apartment"); buildPiece101.Category.Set("RavenHeim"); buildPiece101.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece101.Name.English("MH_D3_Apartment"); buildPiece101.Name.Portuguese_Brazilian("MH_D3_Apartment"); buildPiece101.Description.English("MH_D3_Apartment"); buildPiece101.Description.Portuguese_Brazilian("MH_D3_Apartment"); buildPiece101.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece101.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece102 = new BuildPiece("mar_ravenheim", "MH_D4_A_2Story_Shop"); buildPiece102.Category.Set("RavenHeim"); buildPiece102.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece102.Name.English("MH_D4_A_2Story_Shop"); buildPiece102.Name.Portuguese_Brazilian("MH_D4_A_2Story_Shop"); buildPiece102.Description.English("MH_D4_A_2Story_Shop"); buildPiece102.Description.Portuguese_Brazilian("MH_D4_A_2Story_Shop"); buildPiece102.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece102.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece103 = new BuildPiece("mar_ravenheim", "MH_D4_Apartment"); buildPiece103.Category.Set("RavenHeim"); buildPiece103.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece103.Name.English("MH_D4_Apartment"); buildPiece103.Name.Portuguese_Brazilian("MH_D4_Apartment"); buildPiece103.Description.English("MH_D4_Apartment"); buildPiece103.Description.Portuguese_Brazilian("MH_D4_Apartment"); buildPiece103.RequiredItems.Add("Ravenwood", 120, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece103.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece104 = new BuildPiece("mar_ravenheim", "MH_D6_Apartment"); buildPiece104.Category.Set("RavenHeim"); buildPiece104.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece104.Name.English("MH_D6_Apartment"); buildPiece104.Name.Portuguese_Brazilian("MH_D6_Apartment"); buildPiece104.Description.English("MH_D6_Apartment"); buildPiece104.Description.Portuguese_Brazilian("MH_D6_Apartment"); buildPiece104.RequiredItems.Add("Ravenwood", 140, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece104.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece105 = new BuildPiece("mar_ravenheim", "MH_D7_Apartment"); buildPiece105.Category.Set("RavenHeim"); buildPiece105.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece105.Name.English("MH_D7_Apartment"); buildPiece105.Name.Portuguese_Brazilian("MH_D7_Apartment"); buildPiece105.Description.English("MH_D7_Apartment"); buildPiece105.Description.Portuguese_Brazilian("MH_D7_Apartment"); buildPiece105.RequiredItems.Add("Ravenwood", 140, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece105.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece106 = new BuildPiece("mar_ravenheim", "MH_D8_Apartment"); buildPiece106.Category.Set("RavenHeim"); buildPiece106.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece106.Name.English("MH_D8_Apartment"); buildPiece106.Name.Portuguese_Brazilian("MH_D8_Apartment"); buildPiece106.Description.English("MH_D8_Apartment"); buildPiece106.Description.Portuguese_Brazilian("MH_D8_Apartment"); buildPiece106.RequiredItems.Add("Ravenwood", 140, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece106.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece107 = new BuildPiece("mar_ravenheim", "MH_E1_A_3Story_House"); buildPiece107.Category.Set("RavenHeim"); buildPiece107.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece107.Name.English("MH_E1_A_3Story_House"); buildPiece107.Name.Portuguese_Brazilian("MH_E1_A_3Story_House"); buildPiece107.Description.English("MH_E1_A_3Story_House"); buildPiece107.Description.Portuguese_Brazilian("MH_E1_A_3Story_House"); buildPiece107.RequiredItems.Add("Ravenwood", 140, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece107.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece108 = new BuildPiece("mar_ravenheim", "MH_E2_A_3Story_House"); buildPiece108.Category.Set("RavenHeim"); buildPiece108.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece108.Name.English("MH_E2_A_3Story_House"); buildPiece108.Name.Portuguese_Brazilian("MH_E2_A_3Story_House"); buildPiece108.Description.English("MH_E2_A_3Story_House"); buildPiece108.Description.Portuguese_Brazilian("MH_E2_A_3Story_House"); buildPiece108.RequiredItems.Add("Ravenwood", 150, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece108.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece109 = new BuildPiece("mar_ravenheim", "MH_E3_A_3Story_House"); buildPiece109.Category.Set("RavenHeim"); buildPiece109.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece109.Name.English("MH_E3_A_3Story_House"); buildPiece109.Name.Portuguese_Brazilian("MH_E3_A_3Story_House"); buildPiece109.Description.English("MH_E3_A_3Story_House"); buildPiece109.Description.Portuguese_Brazilian("MH_E3_A_3Story_House"); buildPiece109.RequiredItems.Add("Ravenwood", 200, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece109.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece110 = new BuildPiece("mar_ravenheim", "MH_E6_A_3Story_Shop"); buildPiece110.Category.Set("RavenHeim"); buildPiece110.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece110.Name.English("MH_E6_A_3Story_Shop"); buildPiece110.Name.Portuguese_Brazilian("MH_E6_A_3Story_Shop"); buildPiece110.Description.English("MH_E6_A_3Story_Shop"); buildPiece110.Description.Portuguese_Brazilian("MH_E6_A_3Story_Shop"); buildPiece110.RequiredItems.Add("Ravenwood", 125, recover: true); buildPiece110.RequiredItems.Add("RavenStone", 25, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece110.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece111 = new BuildPiece("mar_ravenheim", "MH_F1_A_4Story_Inn"); buildPiece111.Category.Set("RavenHeim"); buildPiece111.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece111.Name.English("MH_F1_A_4Story_Inn"); buildPiece111.Name.Portuguese_Brazilian("MH_F1_A_4Story_Inn"); buildPiece111.Description.English("MH_F1_A_4Story_Inn"); buildPiece111.Description.Portuguese_Brazilian("MH_F1_A_4Story_Inn"); buildPiece111.RequiredItems.Add("Ravenwood", 220, recover: true); buildPiece111.RequiredItems.Add("RavenStone", 20, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece111.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece112 = new BuildPiece("mar_ravenheim", "MH_G2_A_Gazebo"); buildPiece112.Category.Set("RavenHeim"); buildPiece112.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece112.Name.English("MH_G2_A_Gazebo"); buildPiece112.Name.Portuguese_Brazilian("MH_G2_A_Gazebo"); buildPiece112.Description.English("MH_G2_A_Gazebo"); buildPiece112.Description.Portuguese_Brazilian("MH_G2_A_Gazebo"); buildPiece112.RequiredItems.Add("Ravenwood", 15, recover: true); buildPiece112.RequiredItems.Add("RavenStone", 15, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece112.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece113 = new BuildPiece("mar_ravenheim", "MH_G5_A_WaterWell"); buildPiece113.Category.Set("RavenHeim"); buildPiece113.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece113.Name.English("MH_G5_A_WaterWell"); buildPiece113.Name.Portuguese_Brazilian("MH_G5_A_WaterWell"); buildPiece113.Description.English("MH_G5_A_WaterWell"); buildPiece113.Description.Portuguese_Brazilian("MH_G5_A_WaterWell"); buildPiece113.RequiredItems.Add("Ravenwood", 5, recover: true); buildPiece113.RequiredItems.Add("RavenStone", 5, recover: true); buildPiece113.RequiredItems.Add("RavenRock", 5, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece113.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece114 = new BuildPiece("mar_ravenheim", "MH_Outhouse"); buildPiece114.Category.Set("RavenHeim"); buildPiece114.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece114.Name.English("MH_Outhouse"); buildPiece114.Name.Portuguese_Brazilian("MH_Outhouse"); buildPiece114.Description.English("MH_Outhouse"); buildPiece114.Description.Portuguese_Brazilian("MH_Outhouse"); buildPiece114.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece114.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece115 = new BuildPiece("mar_ravenheim", "MH_Stage_mdl"); buildPiece115.Category.Set("RavenHeim"); buildPiece115.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece115.Name.English("MH_Stage_mdl"); buildPiece115.Name.Portuguese_Brazilian("MH_Stage_mdl"); buildPiece115.Description.English("MH_Stage_mdl"); buildPiece115.Description.Portuguese_Brazilian("MH_Stage_mdl"); buildPiece115.RequiredItems.Add("Ravenwood", 15, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece115.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece116 = new BuildPiece("mar_ravenheim", "MH_MedievalChest_01"); buildPiece116.Category.Set("RavenHeim"); buildPiece116.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece116.Name.English("Medieval Chest"); buildPiece116.Name.Portuguese_Brazilian("Baú Medieval"); buildPiece116.Description.English("A medieval wooden chest for storing items."); buildPiece116.Description.Portuguese_Brazilian("Um baú de madeira medieval para armazenar itens."); buildPiece116.RequiredItems.Add("Ravenwood", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece116.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece117 = new BuildPiece("mar_ravenheim", "MH_MedievalChest_02"); buildPiece117.Category.Set("RavenHeim"); buildPiece117.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece117.Name.English("Medieval Chest II"); buildPiece117.Name.Portuguese_Brazilian("Baú Medieval II"); buildPiece117.Description.English("A larger medieval wooden chest for storing items."); buildPiece117.Description.Portuguese_Brazilian("Um baú de madeira medieval maior para armazenar itens."); buildPiece117.RequiredItems.Add("Ravenwood", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece117.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece118 = new BuildPiece("mar_ravenheim", "MH_MedievalPrivateChest"); buildPiece118.Category.Set("RavenHeim"); buildPiece118.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece118.Name.English("Medieval Private Chest"); buildPiece118.Name.Portuguese_Brazilian("Baú Medieval Privado"); buildPiece118.Description.English("A locked medieval chest for private storage."); buildPiece118.Description.Portuguese_Brazilian("Um baú medieval trancado para armazenamento privado."); buildPiece118.RequiredItems.Add("Ravenwood", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece118.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece119 = new BuildPiece("mar_ravenheim", "MH_Bar_01"); buildPiece119.Category.Set("RavenHeim"); buildPiece119.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece119.Name.English("Bar Counter I"); buildPiece119.Name.Portuguese_Brazilian("Balcão de Bar I"); buildPiece119.Description.English("A medieval wooden bar counter."); buildPiece119.Description.Portuguese_Brazilian("Um balcão de bar medieval de madeira."); buildPiece119.RequiredItems.Add("Ravenwood", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece119.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece120 = new BuildPiece("mar_ravenheim", "MH_Bar_02"); buildPiece120.Category.Set("RavenHeim"); buildPiece120.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece120.Name.English("Bar Counter II"); buildPiece120.Name.Portuguese_Brazilian("Balcão de Bar II"); buildPiece120.Description.English("A medieval wooden bar counter."); buildPiece120.Description.Portuguese_Brazilian("Um balcão de bar medieval de madeira."); buildPiece120.RequiredItems.Add("Ravenwood", 4, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece120.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece121 = new BuildPiece("mar_ravenheim", "MH_Bar_03"); buildPiece121.Category.Set("RavenHeim"); buildPiece121.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece121.Name.English("Bar Counter III"); buildPiece121.Name.Portuguese_Brazilian("Balcão de Bar III"); buildPiece121.Description.English("A medieval wooden bar counter."); buildPiece121.Description.Portuguese_Brazilian("Um balcão de bar medieval de madeira."); buildPiece121.RequiredItems.Add("Ravenwood", 5, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece121.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece122 = new BuildPiece("mar_ravenheim", "MH_BookShelf_01"); buildPiece122.Category.Set("RavenHeim"); buildPiece122.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece122.Name.English("Bookshelf"); buildPiece122.Name.Portuguese_Brazilian("Estante de Livros"); buildPiece122.Description.English("A wooden medieval bookshelf filled with books."); buildPiece122.Description.Portuguese_Brazilian("Uma estante de madeira medieval repleta de livros."); buildPiece122.RequiredItems.Add("Ravenwood", 3, recover: true); buildPiece122.RequiredItems.Add("RavenRation", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece122.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece123 = new BuildPiece("mar_ravenheim", "MH_Chair_01"); buildPiece123.Category.Set("RavenHeim"); buildPiece123.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece123.Name.English("Medieval Chair"); buildPiece123.Name.Portuguese_Brazilian("Cadeira Medieval"); buildPiece123.Description.English("A simple medieval wooden chair."); buildPiece123.Description.Portuguese_Brazilian("Uma simples cadeira de madeira medieval."); buildPiece123.RequiredItems.Add("Ravenwood", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece123.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece124 = new BuildPiece("mar_ravenheim", "MH_CupBoard_01"); buildPiece124.Category.Set("RavenHeim"); buildPiece124.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece124.Name.English("Cupboard I"); buildPiece124.Name.Portuguese_Brazilian("Armário I"); buildPiece124.Description.English("A medieval wooden cupboard."); buildPiece124.Description.Portuguese_Brazilian("Um armário de madeira medieval."); buildPiece124.RequiredItems.Add("Ravenwood", 3, recover: true); buildPiece124.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece124.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece125 = new BuildPiece("mar_ravenheim", "MH_CupBoard_02"); buildPiece125.Category.Set("RavenHeim"); buildPiece125.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece125.Name.English("Cupboard II"); buildPiece125.Name.Portuguese_Brazilian("Armário II"); buildPiece125.Description.English("A medieval wooden cupboard."); buildPiece125.Description.Portuguese_Brazilian("Um armário de madeira medieval."); buildPiece125.RequiredItems.Add("Ravenwood", 3, recover: true); buildPiece125.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece125.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece126 = new BuildPiece("mar_ravenheim", "MH_CupBoard_03"); buildPiece126.Category.Set("RavenHeim"); buildPiece126.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece126.Name.English("Cupboard III"); buildPiece126.Name.Portuguese_Brazilian("Armário III"); buildPiece126.Description.English("A medieval wooden cupboard."); buildPiece126.Description.Portuguese_Brazilian("Um armário de madeira medieval."); buildPiece126.RequiredItems.Add("Ravenwood", 3, recover: true); buildPiece126.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece126.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece127 = new BuildPiece("mar_ravenheim", "MH_DECO_Table_01"); buildPiece127.Category.Set("RavenHeim"); buildPiece127.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece127.Name.English("Decorated Table I"); buildPiece127.Name.Portuguese_Brazilian("Mesa Decorada I"); buildPiece127.Description.English("A decorated medieval table with items on top."); buildPiece127.Description.Portuguese_Brazilian("Uma mesa medieval decorada com itens sobre ela."); buildPiece127.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece127.RequiredItems.Add("RavenRation", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece127.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece128 = new BuildPiece("mar_ravenheim", "MH_DECO_Table_02"); buildPiece128.Category.Set("RavenHeim"); buildPiece128.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece128.Name.English("Decorated Table II"); buildPiece128.Name.Portuguese_Brazilian("Mesa Decorada II"); buildPiece128.Description.English("A decorated medieval table with items on top."); buildPiece128.Description.Portuguese_Brazilian("Uma mesa medieval decorada com itens sobre ela."); buildPiece128.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece128.RequiredItems.Add("RavenRation", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece128.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece129 = new BuildPiece("mar_ravenheim", "MH_DECO_Table_03"); buildPiece129.Category.Set("RavenHeim"); buildPiece129.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece129.Name.English("Decorated Table III"); buildPiece129.Name.Portuguese_Brazilian("Mesa Decorada III"); buildPiece129.Description.English("A decorated medieval table with items on top."); buildPiece129.Description.Portuguese_Brazilian("Uma mesa medieval decorada com itens sobre ela."); buildPiece129.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece129.RequiredItems.Add("RavenRation", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece129.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece130 = new BuildPiece("mar_ravenheim", "MH_DECO_Table_04"); buildPiece130.Category.Set("RavenHeim"); buildPiece130.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece130.Name.English("Decorated Table IV"); buildPiece130.Name.Portuguese_Brazilian("Mesa Decorada IV"); buildPiece130.Description.English("A decorated medieval table with items on top."); buildPiece130.Description.Portuguese_Brazilian("Uma mesa medieval decorada com itens sobre ela."); buildPiece130.RequiredItems.Add("Ravenwood", 2, recover: true); buildPiece130.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece130.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece131 = new BuildPiece("mar_ravenheim", "MH_DECO_Table_05"); buildPiece131.Category.Set("RavenHeim"); buildPiece131.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece131.Name.English("Decorated Table V"); buildPiece131.Name.Portuguese_Brazilian("Mesa Decorada V"); buildPiece131.Description.English("A decorated medieval table with items on top."); buildPiece131.Description.Portuguese_Brazilian("Uma mesa medieval decorada com itens sobre ela."); buildPiece131.RequiredItems.Add("Ravenwood", 2, recover: true); buildPiece131.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece131.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece132 = new BuildPiece("mar_ravenheim", "MH_DECO_Table_06"); buildPiece132.Category.Set("RavenHeim"); buildPiece132.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece132.Name.English("Decorated Table VI"); buildPiece132.Name.Portuguese_Brazilian("Mesa Decorada VI"); buildPiece132.Description.English("A decorated medieval table with items on top."); buildPiece132.Description.Portuguese_Brazilian("Uma mesa medieval decorada com itens sobre ela."); buildPiece132.RequiredItems.Add("Ravenwood", 2, recover: true); buildPiece132.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece132.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece133 = new BuildPiece("mar_ravenheim", "MH_DECO_Table_07"); buildPiece133.Category.Set("RavenHeim"); buildPiece133.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece133.Name.English("Decorated Table VII"); buildPiece133.Name.Portuguese_Brazilian("Mesa Decorada VII"); buildPiece133.Description.English("A decorated medieval table with items on top."); buildPiece133.Description.Portuguese_Brazilian("Uma mesa medieval decorada com itens sobre ela."); buildPiece133.RequiredItems.Add("Ravenwood", 3, recover: true); buildPiece133.RequiredItems.Add("RavenRation", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece133.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece134 = new BuildPiece("mar_ravenheim", "MH_DECO_Wall_Shelf_01"); buildPiece134.Category.Set("RavenHeim"); buildPiece134.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece134.Name.English("Decorated Wall Shelf I"); buildPiece134.Name.Portuguese_Brazilian("Prateleira Decorada I"); buildPiece134.Description.English("A decorative wall shelf with medieval items."); buildPiece134.Description.Portuguese_Brazilian("Uma prateleira de parede decorativa com itens medievais."); buildPiece134.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece134.RequiredItems.Add("RavenRation", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece134.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece135 = new BuildPiece("mar_ravenheim", "MH_DECO_Wall_Shelf_02"); buildPiece135.Category.Set("RavenHeim"); buildPiece135.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece135.Name.English("Decorated Wall Shelf II"); buildPiece135.Name.Portuguese_Brazilian("Prateleira Decorada II"); buildPiece135.Description.English("A decorative wall shelf with medieval items."); buildPiece135.Description.Portuguese_Brazilian("Uma prateleira de parede decorativa com itens medievais."); buildPiece135.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece135.RequiredItems.Add("RavenRation", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece135.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece136 = new BuildPiece("mar_ravenheim", "MH_DECO_Wall_Shelf_03"); buildPiece136.Category.Set("RavenHeim"); buildPiece136.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece136.Name.English("Decorated Wall Shelf III"); buildPiece136.Name.Portuguese_Brazilian("Prateleira Decorada III"); buildPiece136.Description.English("A decorative wall shelf with medieval items."); buildPiece136.Description.Portuguese_Brazilian("Uma prateleira de parede decorativa com itens medievais."); buildPiece136.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece136.RequiredItems.Add("RavenRation", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece136.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece137 = new BuildPiece("mar_ravenheim", "MH_DECO_Wall_Shelf_04"); buildPiece137.Category.Set("RavenHeim"); buildPiece137.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece137.Name.English("Decorated Wall Shelf IV"); buildPiece137.Name.Portuguese_Brazilian("Prateleira Decorada IV"); buildPiece137.Description.English("A decorative wall shelf with medieval items."); buildPiece137.Description.Portuguese_Brazilian("Uma prateleira de parede decorativa com itens medievais."); buildPiece137.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece137.RequiredItems.Add("RavenRation", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece137.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece138 = new BuildPiece("mar_ravenheim", "MH_DoubleBed_01"); buildPiece138.Category.Set("RavenHeim"); buildPiece138.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece138.Name.English("Double Bed"); buildPiece138.Name.Portuguese_Brazilian("Cama de Casal"); buildPiece138.Description.English("A medieval double bed."); buildPiece138.Description.Portuguese_Brazilian("Uma cama de casal medieval."); buildPiece138.RequiredItems.Add("Ravenwood", 5, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece138.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece139 = new BuildPiece("mar_ravenheim", "MH_MeadRack_01"); buildPiece139.Category.Set("RavenHeim"); buildPiece139.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece139.Name.English("Mead Rack"); buildPiece139.Name.Portuguese_Brazilian("Suporte de Hidromel"); buildPiece139.Description.English("A wooden rack for storing mead barrels and bottles."); buildPiece139.Description.Portuguese_Brazilian("Um suporte de madeira para armazenar barris e garrafas de hidromel."); buildPiece139.RequiredItems.Add("Ravenwood", 3, recover: true); buildPiece139.RequiredItems.Add("RavenRation", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece139.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece140 = new BuildPiece("mar_ravenheim", "MH_SingleBed_01"); buildPiece140.Category.Set("RavenHeim"); buildPiece140.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece140.Name.English("Single Bed"); buildPiece140.Name.Portuguese_Brazilian("Cama de Solteiro"); buildPiece140.Description.English("A medieval single bed."); buildPiece140.Description.Portuguese_Brazilian("Uma cama de solteiro medieval."); buildPiece140.RequiredItems.Add("Ravenwood", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece140.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece141 = new BuildPiece("mar_ravenheim", "MH_Stool_01"); buildPiece141.Category.Set("RavenHeim"); buildPiece141.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece141.Name.English("Stool"); buildPiece141.Name.Portuguese_Brazilian("Banquinho"); buildPiece141.Description.English("A simple medieval wooden stool."); buildPiece141.Description.Portuguese_Brazilian("Um simples banquinho de madeira medieval."); buildPiece141.RequiredItems.Add("Ravenwood", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece141.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece142 = new BuildPiece("mar_ravenheim", "MH_Table_01"); buildPiece142.Category.Set("RavenHeim"); buildPiece142.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece142.Name.English("Medieval Table I"); buildPiece142.Name.Portuguese_Brazilian("Mesa Medieval I"); buildPiece142.Description.English("A simple medieval wooden table."); buildPiece142.Description.Portuguese_Brazilian("Uma simples mesa de madeira medieval."); buildPiece142.RequiredItems.Add("Ravenwood", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece142.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece143 = new BuildPiece("mar_ravenheim", "MH_Table_02"); buildPiece143.Category.Set("RavenHeim"); buildPiece143.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece143.Name.English("Medieval Table II"); buildPiece143.Name.Portuguese_Brazilian("Mesa Medieval II"); buildPiece143.Description.English("A simple medieval wooden table."); buildPiece143.Description.Portuguese_Brazilian("Uma simples mesa de madeira medieval."); buildPiece143.RequiredItems.Add("Ravenwood", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece143.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece144 = new BuildPiece("mar_ravenheim", "MH_Table_03"); buildPiece144.Category.Set("RavenHeim"); buildPiece144.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece144.Name.English("Medieval Table III"); buildPiece144.Name.Portuguese_Brazilian("Mesa Medieval III"); buildPiece144.Description.English("A simple medieval wooden table."); buildPiece144.Description.Portuguese_Brazilian("Uma simples mesa de madeira medieval."); buildPiece144.RequiredItems.Add("Ravenwood", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece144.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece145 = new BuildPiece("mar_ravenheim", "MH_Table_04"); buildPiece145.Category.Set("RavenHeim"); buildPiece145.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece145.Name.English("Medieval Table IV"); buildPiece145.Name.Portuguese_Brazilian("Mesa Medieval IV"); buildPiece145.Description.English("A simple medieval wooden table."); buildPiece145.Description.Portuguese_Brazilian("Uma simples mesa de madeira medieval."); buildPiece145.RequiredItems.Add("Ravenwood", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece145.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece146 = new BuildPiece("mar_ravenheim", "MH_Table_05"); buildPiece146.Category.Set("RavenHeim"); buildPiece146.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece146.Name.English("Medieval Table V"); buildPiece146.Name.Portuguese_Brazilian("Mesa Medieval V"); buildPiece146.Description.English("A simple medieval wooden table."); buildPiece146.Description.Portuguese_Brazilian("Uma simples mesa de madeira medieval."); buildPiece146.RequiredItems.Add("Ravenwood", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece146.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece147 = new BuildPiece("mar_ravenheim", "MH_Table_06"); buildPiece147.Category.Set("RavenHeim"); buildPiece147.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece147.Name.English("Medieval Table VI"); buildPiece147.Name.Portuguese_Brazilian("Mesa Medieval VI"); buildPiece147.Description.English("A simple medieval wooden table."); buildPiece147.Description.Portuguese_Brazilian("Uma simples mesa de madeira medieval."); buildPiece147.RequiredItems.Add("Ravenwood", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece147.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece148 = new BuildPiece("mar_ravenheim", "MH_Wall_Shelf_01"); buildPiece148.Category.Set("RavenHeim"); buildPiece148.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece148.Name.English("Wall Shelf"); buildPiece148.Name.Portuguese_Brazilian("Prateleira de Parede"); buildPiece148.Description.English("A simple medieval wooden wall shelf."); buildPiece148.Description.Portuguese_Brazilian("Uma simples prateleira de parede de madeira medieval."); buildPiece148.RequiredItems.Add("Ravenwood", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece148.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece149 = new BuildPiece("mar_ravenheim", "MH_Wardrobe_01"); buildPiece149.Category.Set("RavenHeim"); buildPiece149.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece149.Name.English("Wardrobe I"); buildPiece149.Name.Portuguese_Brazilian("Guarda-Roupa I"); buildPiece149.Description.English("A medieval wooden wardrobe."); buildPiece149.Description.Portuguese_Brazilian("Um guarda-roupa de madeira medieval."); buildPiece149.RequiredItems.Add("Ravenwood", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece149.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece150 = new BuildPiece("mar_ravenheim", "MH_Wardrobe_02"); buildPiece150.Category.Set("RavenHeim"); buildPiece150.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece150.Name.English("Wardrobe II"); buildPiece150.Name.Portuguese_Brazilian("Guarda-Roupa II"); buildPiece150.Description.English("A medieval wooden wardrobe."); buildPiece150.Description.Portuguese_Brazilian("Um guarda-roupa de madeira medieval."); buildPiece150.RequiredItems.Add("Ravenwood", 4, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece150.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece151 = new BuildPiece("mar_ravenheim", "MH_Wardrobe_03"); buildPiece151.Category.Set("RavenHeim"); buildPiece151.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece151.Name.English("Wardrobe III"); buildPiece151.Name.Portuguese_Brazilian("Guarda-Roupa III"); buildPiece151.Description.English("A medieval wooden wardrobe."); buildPiece151.Description.Portuguese_Brazilian("Um guarda-roupa de madeira medieval."); buildPiece151.RequiredItems.Add("Ravenwood", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece151.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece152 = new BuildPiece("mar_ravenheim", "MH_WineRack_01"); buildPiece152.Category.Set("RavenHeim"); buildPiece152.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece152.Name.English("Wine Rack"); buildPiece152.Name.Portuguese_Brazilian("Adega de Vinho"); buildPiece152.Description.English("A wooden rack for storing wine bottles."); buildPiece152.Description.Portuguese_Brazilian("Um suporte de madeira para armazenar garrafas de vinho."); buildPiece152.RequiredItems.Add("Ravenwood", 3, recover: true); buildPiece152.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece152.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece153 = new BuildPiece("mar_ravenheim", "MH_Candle"); buildPiece153.Category.Set("RavenHeim"); buildPiece153.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece153.Name.English("Candle"); buildPiece153.Name.Portuguese_Brazilian("Vela"); buildPiece153.Description.English("A simple medieval candle."); buildPiece153.Description.Portuguese_Brazilian("Uma simples vela medieval."); buildPiece153.RequiredItems.Add("RavenRation", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece153.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece154 = new BuildPiece("mar_ravenheim", "MH_CandleHolder_01"); buildPiece154.Category.Set("RavenHeim"); buildPiece154.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece154.Name.English("Candle Holder I"); buildPiece154.Name.Portuguese_Brazilian("Castiçal I"); buildPiece154.Description.English("A medieval candle holder."); buildPiece154.Description.Portuguese_Brazilian("Um castiçal medieval."); buildPiece154.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece154.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece155 = new BuildPiece("mar_ravenheim", "MH_CandleHolder_02"); buildPiece155.Category.Set("RavenHeim"); buildPiece155.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece155.Name.English("Candle Holder II"); buildPiece155.Name.Portuguese_Brazilian("Castiçal II"); buildPiece155.Description.English("A medieval candle holder."); buildPiece155.Description.Portuguese_Brazilian("Um castiçal medieval."); buildPiece155.RequiredItems.Add("RavenRation", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece155.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece156 = new BuildPiece("mar_ravenheim", "MH_CandleHolder_03"); buildPiece156.Category.Set("RavenHeim"); buildPiece156.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece156.Name.English("Candle Holder III"); buildPiece156.Name.Portuguese_Brazilian("Castiçal III"); buildPiece156.Description.English("A medieval candle holder."); buildPiece156.Description.Portuguese_Brazilian("Um castiçal medieval."); buildPiece156.RequiredItems.Add("RavenRation", 4, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece156.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece157 = new BuildPiece("mar_ravenheim", "MH_CandleHolder_04"); buildPiece157.Category.Set("RavenHeim"); buildPiece157.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece157.Name.English("Candle Holder IV"); buildPiece157.Name.Portuguese_Brazilian("Castiçal IV"); buildPiece157.Description.English("A medieval candle holder."); buildPiece157.Description.Portuguese_Brazilian("Um castiçal medieval."); buildPiece157.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece157.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece158 = new BuildPiece("mar_ravenheim", "MH_CandleHolder_05"); buildPiece158.Category.Set("RavenHeim"); buildPiece158.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece158.Name.English("Candle Holder V"); buildPiece158.Name.Portuguese_Brazilian("Castiçal V"); buildPiece158.Description.English("A medieval candle holder."); buildPiece158.Description.Portuguese_Brazilian("Um castiçal medieval."); buildPiece158.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece158.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece159 = new BuildPiece("mar_ravenheim", "MH_CandleHolder_06"); buildPiece159.Category.Set("RavenHeim"); buildPiece159.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece159.Name.English("Candle Holder VI"); buildPiece159.Name.Portuguese_Brazilian("Castiçal VI"); buildPiece159.Description.English("A medieval candle holder."); buildPiece159.Description.Portuguese_Brazilian("Um castiçal medieval."); buildPiece159.RequiredItems.Add("RavenRation", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece159.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece160 = new BuildPiece("mar_ravenheim", "MH_Chandelier_01"); buildPiece160.Category.Set("RavenHeim"); buildPiece160.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece160.Name.English("Chandelier I"); buildPiece160.Name.Portuguese_Brazilian("Lustre I"); buildPiece160.Description.English("A decorative medieval chandelier."); buildPiece160.Description.Portuguese_Brazilian("Um lustre medieval decorativo."); buildPiece160.RequiredItems.Add("RavenStone", 1, recover: true); buildPiece160.RequiredItems.Add("RavenRation", 4, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece160.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece161 = new BuildPiece("mar_ravenheim", "MH_Chandelier_02"); buildPiece161.Category.Set("RavenHeim"); buildPiece161.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece161.Name.English("Chandelier II"); buildPiece161.Name.Portuguese_Brazilian("Lustre II"); buildPiece161.Description.English("A decorative medieval chandelier."); buildPiece161.Description.Portuguese_Brazilian("Um lustre medieval decorativo."); buildPiece161.RequiredItems.Add("RavenStone", 1, recover: true); buildPiece161.RequiredItems.Add("RavenRation", 5, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece161.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece162 = new BuildPiece("mar_ravenheim", "MH_Chandelier_03"); buildPiece162.Category.Set("RavenHeim"); buildPiece162.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece162.Name.English("Chandelier III"); buildPiece162.Name.Portuguese_Brazilian("Lustre III"); buildPiece162.Description.English("A decorative medieval chandelier."); buildPiece162.Description.Portuguese_Brazilian("Um lustre medieval decorativo."); buildPiece162.RequiredItems.Add("RavenStone", 2, recover: true); buildPiece162.RequiredItems.Add("RavenRation", 10, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece162.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece163 = new BuildPiece("mar_ravenheim", "BannerPole1"); buildPiece163.Category.Set("RavenHeim"); buildPiece163.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece163.Name.English("Banner Pole 1"); buildPiece163.Name.Portuguese_Brazilian("Mastro de Banner 1"); buildPiece163.Description.English("A decorative medieval banner pole."); buildPiece163.Description.Portuguese_Brazilian("Um mastro de banner medieval decorativo."); buildPiece163.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece163.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece164 = new BuildPiece("mar_ravenheim", "BannerPole2"); buildPiece164.Category.Set("RavenHeim"); buildPiece164.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece164.Name.English("Banner Pole 2"); buildPiece164.Name.Portuguese_Brazilian("Mastro de Banner 2"); buildPiece164.Description.English("A decorative medieval banner pole."); buildPiece164.Description.Portuguese_Brazilian("Um mastro de banner medieval decorativo."); buildPiece164.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece164.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece165 = new BuildPiece("mar_ravenheim", "BannerPole3"); buildPiece165.Category.Set("RavenHeim"); buildPiece165.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece165.Name.English("Banner Pole 3"); buildPiece165.Name.Portuguese_Brazilian("Mastro de Banner 3"); buildPiece165.Description.English("A decorative medieval banner pole."); buildPiece165.Description.Portuguese_Brazilian("Um mastro de banner medieval decorativo."); buildPiece165.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece165.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece166 = new BuildPiece("mar_ravenheim", "BannerPole4"); buildPiece166.Category.Set("RavenHeim"); buildPiece166.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece166.Name.English("Banner Pole 4"); buildPiece166.Name.Portuguese_Brazilian("Mastro de Banner 4"); buildPiece166.Description.English("A decorative medieval banner pole."); buildPiece166.Description.Portuguese_Brazilian("Um mastro de banner medieval decorativo."); buildPiece166.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece166.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece167 = new BuildPiece("mar_ravenheim", "BannerPole5"); buildPiece167.Category.Set("RavenHeim"); buildPiece167.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece167.Name.English("Banner Pole 5"); buildPiece167.Name.Portuguese_Brazilian("Mastro de Banner 5"); buildPiece167.Description.English("A decorative medieval banner pole."); buildPiece167.Description.Portuguese_Brazilian("Um mastro de banner medieval decorativo."); buildPiece167.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece167.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece168 = new BuildPiece("mar_ravenheim", "Sign_Alchemy_Village"); buildPiece168.Category.Set("RavenHeim"); buildPiece168.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece168.Name.English("Alchemy Shop Sign"); buildPiece168.Name.Portuguese_Brazilian("Placa de Alquimia"); buildPiece168.Description.English("A wooden sign for an alchemy shop."); buildPiece168.Description.Portuguese_Brazilian("Uma placa de madeira para uma loja de alquimia."); buildPiece168.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece168.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece169 = new BuildPiece("mar_ravenheim", "Sign_Blacksmith_Village"); buildPiece169.Category.Set("RavenHeim"); buildPiece169.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece169.Name.English("Blacksmith Shop Sign"); buildPiece169.Name.Portuguese_Brazilian("Placa de Ferreiro"); buildPiece169.Description.English("A wooden sign for a blacksmith shop."); buildPiece169.Description.Portuguese_Brazilian("Uma placa de madeira para uma ferraria."); buildPiece169.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece169.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece170 = new BuildPiece("mar_ravenheim", "Sign_Goods_Village"); buildPiece170.Category.Set("RavenHeim"); buildPiece170.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece170.Name.English("General Goods Sign"); buildPiece170.Name.Portuguese_Brazilian("Placa de Mercadorias"); buildPiece170.Description.English("A wooden sign for a general goods store."); buildPiece170.Description.Portuguese_Brazilian("Uma placa de madeira para uma loja de mercadorias gerais."); buildPiece170.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece170.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece171 = new BuildPiece("mar_ravenheim", "Sign_Inn_Village"); buildPiece171.Category.Set("RavenHeim"); buildPiece171.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece171.Name.English("Inn Sign"); buildPiece171.Name.Portuguese_Brazilian("Placa de Pousada"); buildPiece171.Description.English("A wooden sign for an inn."); buildPiece171.Description.Portuguese_Brazilian("Uma placa de madeira para uma pousada."); buildPiece171.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece171.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece172 = new BuildPiece("mar_ravenheim", "Sign_Magic_Village"); buildPiece172.Category.Set("RavenHeim"); buildPiece172.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece172.Name.English("Magic Shop Sign"); buildPiece172.Name.Portuguese_Brazilian("Placa de Loja de Magia"); buildPiece172.Description.English("A wooden sign for a magic shop."); buildPiece172.Description.Portuguese_Brazilian("Uma placa de madeira para uma loja de magia."); buildPiece172.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece172.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece173 = new BuildPiece("mar_ravenheim", "Sign_Tavern_Village"); buildPiece173.Category.Set("RavenHeim"); buildPiece173.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece173.Name.English("Tavern Sign"); buildPiece173.Name.Portuguese_Brazilian("Placa de Taverna"); buildPiece173.Description.English("A wooden sign for a tavern."); buildPiece173.Description.Portuguese_Brazilian("Uma placa de madeira para uma taverna."); buildPiece173.RequiredItems.Add("RavenRune", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece173.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece174 = new BuildPiece("mar_ravenheim", "Dummy_village"); buildPiece174.Category.Set("RavenHeim"); buildPiece174.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece174.Name.English("Training Dummy"); buildPiece174.Name.Portuguese_Brazilian("Boneco de Treino"); buildPiece174.Description.English("A wooden training dummy for combat practice."); buildPiece174.Description.Portuguese_Brazilian("Um boneco de madeira para praticar combate."); buildPiece174.RequiredItems.Add("RavenRune", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece174.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece175 = new BuildPiece("mar_ravenheim", "IronFirePit_Village"); buildPiece175.Category.Set("RavenHeim"); buildPiece175.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece175.Name.English("Iron Fire Pit"); buildPiece175.Name.Portuguese_Brazilian("Fogueira de Ferro"); buildPiece175.Description.English("An iron fire pit for outdoor lighting and warmth."); buildPiece175.Description.Portuguese_Brazilian("Uma fogueira de ferro para iluminação e calor ao ar livre."); buildPiece175.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece175.RequiredItems.Add("RavenStone", 1, recover: true); buildPiece175.RequiredItems.Add("RavenRock", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece175.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece176 = new BuildPiece("mar_ravenheim", "StreetLampPole"); buildPiece176.Category.Set("RavenHeim"); buildPiece176.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece176.Name.English("Street Lamp Pole"); buildPiece176.Name.Portuguese_Brazilian("Poste de Lampião"); buildPiece176.Description.English("A medieval street lamp pole for illuminating roads."); buildPiece176.Description.Portuguese_Brazilian("Um poste de lampião medieval para iluminar ruas."); buildPiece176.RequiredItems.Add("Ravenwood", 2, recover: true); buildPiece176.RequiredItems.Add("RavenStone", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece176.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece177 = new BuildPiece("mar_ravenheim", "WheelPostPole"); buildPiece177.Category.Set("RavenHeim"); buildPiece177.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece177.Name.English("Wheel Post Pole"); buildPiece177.Name.Portuguese_Brazilian("Poste com Roda"); buildPiece177.Description.English("A decorative post with a wooden wheel."); buildPiece177.Description.Portuguese_Brazilian("Um poste decorativo com uma roda de madeira."); buildPiece177.RequiredItems.Add("Ravenwood", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece177.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece178 = new BuildPiece("mar_ravenheim", "Canopy_01"); buildPiece178.Category.Set("RavenHeim"); buildPiece178.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece178.Name.English("Canopy 01"); buildPiece178.Name.Portuguese_Brazilian("Toldo 01"); buildPiece178.Description.English("An Canopy to protect and decorate your villa."); buildPiece178.Description.Portuguese_Brazilian("Um toldo para proteger e decorar a sua vila."); buildPiece178.RequiredItems.Add("RavenRune", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece178.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece179 = new BuildPiece("mar_ravenheim", "Canopy_02"); buildPiece179.Category.Set("RavenHeim"); buildPiece179.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece179.Name.English("Canopy 02"); buildPiece179.Name.Portuguese_Brazilian("Toldo 02"); buildPiece179.Description.English("An Canopy to protect and decorate your villa."); buildPiece179.Description.Portuguese_Brazilian("Um toldo para proteger e decorar a sua vila."); buildPiece179.RequiredItems.Add("RavenRune", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece179.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece180 = new BuildPiece("mar_ravenheim", "Canopy_03"); buildPiece180.Category.Set("RavenHeim"); buildPiece180.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece180.Name.English("Canopy 03"); buildPiece180.Name.Portuguese_Brazilian("Toldo 03"); buildPiece180.Description.English("An Canopy to protect and decorate your villa."); buildPiece180.Description.Portuguese_Brazilian("Um toldo para proteger e decorar a sua vila."); buildPiece180.RequiredItems.Add("RavenRune", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece180.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece181 = new BuildPiece("mar_ravenheim", "Canopy_04"); buildPiece181.Category.Set("RavenHeim"); buildPiece181.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece181.Name.English("Canopy 04"); buildPiece181.Name.Portuguese_Brazilian("Toldo 04"); buildPiece181.Description.English("An Canopy to protect and decorate your villa."); buildPiece181.Description.Portuguese_Brazilian("Um toldo para proteger e decorar a sua vila."); buildPiece181.RequiredItems.Add("RavenRune", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece181.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece182 = new BuildPiece("mar_ravenheim", "Canopy_05"); buildPiece182.Category.Set("RavenHeim"); buildPiece182.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece182.Name.English("Canopy 05"); buildPiece182.Name.Portuguese_Brazilian("Toldo 05"); buildPiece182.Description.English("An Canopy to protect and decorate your villa."); buildPiece182.Description.Portuguese_Brazilian("Um toldo para proteger e decorar a sua vila."); buildPiece182.RequiredItems.Add("RavenRune", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece182.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece183 = new BuildPiece("mar_ravenheim", "Canopy_06"); buildPiece183.Category.Set("RavenHeim"); buildPiece183.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece183.Name.English("Canopy 06"); buildPiece183.Name.Portuguese_Brazilian("Toldo 06"); buildPiece183.Description.English("An Canopy to protect and decorate your villa."); buildPiece183.Description.Portuguese_Brazilian("Um toldo para proteger e decorar a sua vila."); buildPiece183.RequiredItems.Add("RavenRune", 2, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece183.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece184 = new BuildPiece("mar_ravenheim", "MH_blacksmith_anvil"); buildPiece184.Category.Set("RavenHeim"); buildPiece184.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece184.Name.English("Blacksmith Anvil"); buildPiece184.Name.Portuguese_Brazilian("Bigorna de Ferreiro"); buildPiece184.Description.English("A heavy iron anvil used in a blacksmith's workshop."); buildPiece184.Description.Portuguese_Brazilian("Uma pesada bigorna de ferro usada em uma ferraria."); buildPiece184.RequiredItems.Add("RavenStone", 2, recover: true); buildPiece184.RequiredItems.Add("RavenRock", 3, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece184.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece185 = new BuildPiece("mar_ravenheim", "MH_Blacksmith_Grinding_Stone"); buildPiece185.Category.Set("RavenHeim"); buildPiece185.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece185.Name.English("Grinding RavenRation"); buildPiece185.Name.Portuguese_Brazilian("Pedra de Afiar"); buildPiece185.Description.English("A stone wheel used for sharpening blades."); buildPiece185.Description.Portuguese_Brazilian("Uma roda de pedra usada para afiar lâminas."); buildPiece185.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece185.RequiredItems.Add("RavenStone", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece185.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece186 = new BuildPiece("mar_ravenheim", "MH_Blacksmith_Tools_Rack"); buildPiece186.Category.Set("RavenHeim"); buildPiece186.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece186.Name.English("Blacksmith Tools Rack"); buildPiece186.Name.Portuguese_Brazilian("Suporte de Ferramentas de Ferreiro"); buildPiece186.Description.English("A wall rack holding blacksmith tools and equipment."); buildPiece186.Description.Portuguese_Brazilian("Um suporte de parede com ferramentas e equipamentos de ferreiro."); buildPiece186.RequiredItems.Add("Ravenwood", 1, recover: true); buildPiece186.RequiredItems.Add("RavenStone", 1, recover: true); buildPiece186.RequiredItems.Add("RavenRock", 1, recover: true); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece186.Prefab, MaterialReplacer.ShaderType.UseUnityShader); GameObject val = PrefabManager.RegisterPrefab("mar_ravenheim", "sfx_build_hammer_metal_Constructions"); GameObject val2 = PrefabManager.RegisterPrefab("mar_ravenheim", "sfx_build_hammer_stone_construction"); GameObject val3 = PrefabManager.RegisterPrefab("mar_ravenheim", "sfx_build_hammer_wood_construction"); GameObject val4 = PrefabManager.RegisterPrefab("mar_ravenheim", "sfx_chest_close_constructions"); GameObject val5 = PrefabManager.RegisterPrefab("mar_ravenheim", "sfx_chest_open_constructions"); GameObject val6 = PrefabManager.RegisterPrefab("mar_ravenheim", "sfx_metal_blocked_Constructions"); GameObject val7 = PrefabManager.RegisterPrefab("mar_ravenheim", "sfx_rock_destroyed_construction"); GameObject val8 = PrefabManager.RegisterPrefab("mar_ravenheim", "sfx_wood_destroyed_construction"); GameObject val9 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_HitSparks_constructions"); GameObject val10 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_Place_construction"); GameObject val11 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_Place_Lustres_constructions"); GameObject val12 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_Place_stone_floor_2x2_constructions"); GameObject val13 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_Place_stone_floor_constructions"); GameObject val14 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_Place_wood_pole_constructions"); GameObject val15 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_Place_wood_wall_construction"); GameObject val16 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_Place_workbench_construction"); GameObject val17 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_RockHit_constructions"); GameObject val18 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_SawDust_construction"); GameObject val19 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_stone_floor_2x2_destroyed_constructions"); GameObject val20 = PrefabManager.RegisterPrefab("mar_ravenheim", "vfx_stone_floor_destroyed_constructions"); 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 { RavenHeim.LogDebug((object)"ReadConfigValues called"); ((BaseUnityPlugin)this).Config.Reload(); } catch { RavenHeim.LogError((object)("There was an issue loading your " + ConfigFileName)); RavenHeim.LogError((object)"Please check your config entries for spelling and format!"); } } private ConfigEntry config<[<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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<[<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>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); } public ConfigEntry ModConfig<[<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(2)] T>(string group, string name, T value, string description, bool synchronizedSetting = true) { return config(group, name, value, description, synchronizedSetting); } private static int GetZDO(int prefabHash) { int num = 0; List[] objectsBySector = ZDOMan.instance.m_objectsBySector; foreach (List list in objectsBySector) { if (list == null) { continue; } for (int j = 0; j < list.Count; j++) { ZDO val = list[j]; if (val.GetPrefab() == prefabHash) { num++; } } } return num; } private static int GetPrefabCount(int prefabHash) { int num = 0; List[] objectsBySector = ZDOMan.instance.m_objectsBySector; foreach (List list in objectsBySector) { if (list == null) { continue; } for (int j = 0; j < list.Count; j++) { ZDO val = list[j]; if (val.GetPrefab() == prefabHash) { num++; } } } return num; } static RavenHeimPlugin() { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName; RavenHeim = Logger.CreateLogSource("RavenHeim"); ConfigSync = new ConfigSync("JamesJones.RavenHeim") { DisplayName = "RavenHeim", CurrentVersion = "0.0.1", MinimumRequiredVersion = "0.0.1", ModRequired = true }; } } [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [Obfuscation(Exclude = true, ApplyToMembers = true)] [NullableContext(1)] public class CoroutineHelper : MonoBehaviour { private static CoroutineHelper _instance; public static CoroutineHelper Instance { get { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if ((Object)(object)_instance == (Object)null) { GameObject val = new GameObject("CoroutineHelper"); _instance = val.AddComponent(); Object.DontDestroyOnLoad((Object)(object)val); } return _instance; } } } [Obfuscation(Exclude = true, ApplyToMembers = true)] [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] [NullableContext(1)] public static class RavenHeim_Patchs { [HarmonyPatch(typeof(Chair), "GetHoverText")] [NullableContext(0)] [Obfuscation(Exclude = true, ApplyToMembers = true)] public static class SitEffect_Chair_GetHoverText_Patch { [NullableContext(1)] private static void Postfix(Chair __instance, ref string __result) { if (!(((Object)((Component)__instance).gameObject).name != "Privada") && _isDirty) { __result += "\n[Shift + E] Clear"; } } } [NullableContext(0)] [HarmonyPatch(typeof(Chair), "Interact")] [Obfuscation(Exclude = true, ApplyToMembers = true)] public static class SitEffect_Chair_Interact_Patch { [NullableContext(1)] private static bool Prefix(Chair __instance, Humanoid human, bool hold, bool alt, ref bool __runOriginal) { //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null || (Object)(object)human == (Object)null || !((Character)human).IsPlayer() || ((Object)((Component)__instance).gameObject).name != "Privada") { return true; } __runOriginal = false; Player val = (Player)(object)((human is Player) ? human : null); if (hold || !__instance.InUseDistance((Humanoid)(object)val)) { return false; } FindEffects(((Component)__instance).transform.parent); if (alt) { if (_isDirty) { CleanEffects(); } return false; } if (_isDirty) { ((Character)Player.m_localPlayer).Message((MessageType)2, "The toilet is dirty, clean it before using.", 0, (Sprite)null); return false; } if (Time.time - Chair.m_lastSitTime < 1f) { return false; } Player closestPlayer = Player.GetClosestPlayer(__instance.m_attachPoint.position, 0.1f); if ((Object)(object)closestPlayer != (Object)null && (Object)(object)closestPlayer != (Object)(object)Player.m_localPlayer) { ((Character)Player.m_localPlayer).Message((MessageType)2, "$msg_blocked", 0, (Sprite)null); return false; } if (Object.op_Implicit((Object)(object)val) && !((Character)val).IsEncumbered()) { ((Character)val).AttachStart(__instance.m_attachPoint, (GameObject)null, false, false, __instance.m_inShip, __instance.m_attachAnimation, __instance.m_detachOffset, (Transform)null); Chair.m_lastSitTime = Time.time; _activateCoroutine = ((MonoBehaviour)CoroutineHelper.Instance).StartCoroutine(ActivateSequence()); } return false; } } [NullableContext(0)] [Obfuscation(Exclude = true, ApplyToMembers = true)] [HarmonyPatch(typeof(Player), "UpdatePlacement")] public static class Player_UpdatePlacement_Patch { [NullableContext(1)] private static void Prefix(Player __instance, ref float ___m_maxPlaceDistance) { RavenHeimPlugin component = Chainloader.ManagerObject.GetComponent(); ___m_maxPlaceDistance = component.maximumPlacementDistance.Value; } } [CompilerGenerated] private sealed class d__9 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; [<2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] private object <>2__current; object IEnumerator.Current { [DebuggerHidden] [return: <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <2b5270e4-1ff0-41d1-b470-1cfc15304a4e>Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public d__9(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; case 1: <>1__state = -1; PlayAudio(poopSfxTransform); <>2__current = (object)new WaitForSeconds(3f); <>1__state = 2; return true; case 2: <>1__state = -1; if ((Object)(object)fliesTransform != (Object)null) { ((Component)fliesTransform).gameObject.SetActive(true); } if ((Object)(object)poopTransform != (Object)null) { ((Component)poopTransform).gameObject.SetActive(true); } PlayAudio(fliesSfxTransform); _isDirty = true; _activateCoroutine = 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 Transform fliesTransform; private static Transform poopTransform; private static Transform fliesSfxTransform; private static Transform poopSfxTransform; private static Transform descargaTransform; private static bool _isDirty; private static Coroutine _activateCoroutine; private static void FindEffects(Transform outhouse) { if (!((Object)(object)fliesTransform != (Object)null)) { fliesTransform = outhouse.Find("Flies"); poopTransform = outhouse.Find("Poop"); fliesSfxTransform = outhouse.Find("FliesSfx"); poopSfxTransform = outhouse.Find("PoopSfx"); descargaTransform = outhouse.Find("Descarga"); } } private static void PlayAudio(Transform t) { if (!((Object)(object)t == (Object)null)) { ((Component)t).gameObject.SetActive(true); AudioSource component = ((Component)t).GetComponent(); if ((Object)(object)component != (Object)null) { component.Stop(); component.Play(); } } } [IteratorStateMachine(typeof(d__9))] private static IEnumerator ActivateSequence() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__9(0); } private static void CleanEffects() { if (_activateCoroutine != null) { ((MonoBehaviour)CoroutineHelper.Instance).StopCoroutine(_activateCoroutine); _activateCoroutine = null; } if ((Object)(object)fliesTransform != (Object)null) { ((Component)fliesTransform).gameObject.SetActive(false); } if ((Object)(object)poopTransform != (Object)null) { ((Component)poopTransform).gameObject.SetActive(false); } if ((Object)(object)fliesSfxTransform != (Object)null) { ((Component)fliesSfxTransform).gameObject.SetActive(false); } if ((Object)(object)poopSfxTransform != (Object)null) { ((Component)poopSfxTransform).gameObject.SetActive(false); } PlayAudio(descargaTransform); _isDirty = false; } } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<819a1045-a40c-4e92-9263-26a5694ef087>Embedded] internal sealed class <819a1045-a40c-4e92-9263-26a5694ef087>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] [<819a1045-a40c-4e92-9263-26a5694ef087>Embedded] [CompilerGenerated] internal sealed class <122d0949-ec00-48ad-9702-c77a20cd3752>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <122d0949-ec00-48ad-9702-c77a20cd3752>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <122d0949-ec00-48ad-9702-c77a20cd3752>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [<819a1045-a40c-4e92-9263-26a5694ef087>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [CompilerGenerated] internal sealed class <0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContextAttribute : Attribute { public readonly byte Flag; public <0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [<819a1045-a40c-4e92-9263-26a5694ef087>Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class <2e3f38d1-dd12-42ca-8cfe-ac9675e48622>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <2e3f38d1-dd12-42ca-8cfe-ac9675e48622>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 } [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(1)] internal class InternalName : Attribute { public readonly string internalName; public InternalName(string internalName) { this.internalName = internalName; } } [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(1)] [PublicAPI] [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] 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 }); } } [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(1)] [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 }); } } [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(1)] [<122d0949-ec00-48ad-9702-c77a20cd3752>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; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] public ConfigEntryBase RecipeIsActive; } [PublicAPI] internal class Trade { public Trader Trader; public uint Price; public uint Stack = 1u; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] public string RequiredGlobalKey; } [PublicAPI] [Flags] internal enum Trader { None = 0, Haldor = 1, Hildir = 2 } internal struct Requirement { [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(1)] public string itemName; public int amount; [<122d0949-ec00-48ad-9702-c77a20cd3752>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; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] public string custom; } [Flags] internal enum Configurability { Disabled = 0, Recipe = 1, Stats = 2, Drop = 4, Trader = 8, Full = 0xF } [PublicAPI] [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 { [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(1)] public string creature; public int min; public int max; public float chance; public bool levelMultiplier; } internal enum Toggle { On = 1, Off = 0 } [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(1)] [PublicAPI] internal class Item { [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] private class ItemConfig { [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 2, 1 })] public ConfigEntry craft; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 2, 1 })] public ConfigEntry upgrade; public ConfigEntry table; public ConfigEntry tableLevel; public ConfigEntry customTable; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] public ConfigEntry maximumTableLevel; public ConfigEntry requireOneIngredient; public ConfigEntry qualityResultAmountMultiplier; } [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] private class TraderConfig { public ConfigEntry trader; public ConfigEntry price; public ConfigEntry stack; public ConfigEntry requiredGlobalKey; } [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] private class RequirementQuality { public int quality; } [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(2)] private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [UsedImplicitly] public string Category; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 2, 1 })] [UsedImplicitly] public Action CustomDrawer; public Func browsability; } [PublicAPI] [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] public enum DamageModifier { Normal, Resistant, Weak, Immune, Ignore, VeryResistant, VeryWeak, None } [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] private delegate void setDmgFunc(ref DamageTypes dmg, float value); [<122d0949-ec00-48ad-9702-c77a20cd3752>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] (Requirement r) => $"{r.itemName}:{r.amount}" + ((r.quality > 0) ? $":{r.quality}" : ""))); } [return: <122d0949-ec00-48ad-9702-c77a20cd3752>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)([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] (Requirement r) => r.itemName), (Func)([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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(); [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(2)] ItemDrop ResItem(Requirement r) { return fetchByName(objectDB, r.itemName); } } } [<122d0949-ec00-48ad-9702-c77a20cd3752>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] (DropTarget r) => $"{r.creature}:{r.chance.ToString(CultureInfo.InvariantCulture)}:{r.min}:" + ((r.min == r.max) ? "" : $"{r.max}") + (r.levelMultiplier ? "" : ":0"))); } [return: <122d0949-ec00-48ad-9702-c77a20cd3752>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; [<122d0949-ec00-48ad-9702-c77a20cd3752>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; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 0, 1 })] private IEnumerable instructions; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 0, 1 })] public IEnumerable <>3__instructions; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 0, 1 })] private List 5__2; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(0)] private FieldInfo 5__3; private int 5__4; CodeInstruction IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <122d0949-ec00-48ad-9702-c77a20cd3752>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: <122d0949-ec00-48ad-9702-c77a20cd3752>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: <122d0949-ec00-48ad-9702-c77a20cd3752>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>>(); [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 1, 1, 2 })] private static Dictionary hiddenCraftRecipes = new Dictionary(); [<122d0949-ec00-48ad-9702-c77a20cd3752>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; [<122d0949-ec00-48ad-9702-c77a20cd3752>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(); [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] private LocalizeKey _name; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] private LocalizeKey _description; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] private static object configManager; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] private static Localization _english; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] private static BaseUnityPlugin _plugin; private static bool hasConfigSync = true; [<122d0949-ec00-48ad-9702-c77a20cd3752>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; [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] [Description("Specifies a config entry which toggles whether a recipe is active.")] public ConfigEntryBase RecipeIsActive { [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(2)] get { return this[""].RecipeIsActive; } [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(2)] private static object configSync { [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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, [<122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 1, 1, 0 })] Func readDefault, [<122d0949-ec00-48ad-9702-c77a20cd3752>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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: <122d0949-ec00-48ad-9702-c77a20cd3752>Nullable(new byte[] { 1, 0 })] ConfigEntry traderConfig(string name, [<122d0949-ec00-48ad-9702-c77a20cd3752>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 += [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] (Inventory i) => i.GetAllItems()))) { if (item.m_shared.m_name == name) { callback(item); } } } public void ApplyToAllInstances(Action callback) { ApplyToAllInstances(Prefab, callback); } [<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>NullableContext(0)] [return: <122d0949-ec00-48ad-9702-c77a20cd3752>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([<0b95b55f-024f-4fa9-a4b5-c41638b5ad1a>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([<122d0949-ec00-48ad-9702-c77a20cd3752>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([<122d0949-ec00-48ad-9702-c77a20cd3752>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