Decompiled source of sunnfjordheimexp v1.0.3
sunnfjordheimexp.dll
Decompiled 5 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using ItemManager; using JetBrains.Annotations; using LocalizationManager; using Microsoft.CodeAnalysis; using PieceManager; using ServerSync; using TMPro; using UnityEngine; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.BufferedDeserialization; using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("sunnfjordheimexp")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Zzyzxrd")] [assembly: AssemblyProduct("sunnfjordheimexp")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")] [assembly: AssemblyFileVersion("1.0.3")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.3.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace sunnfjordheimexp { [BepInPlugin("Zzyzxrd.sunnfjordheimexp", "sunnfjordheimexp", "1.0.3")] public class sunnfjordheimexpPlugin : BaseUnityPlugin { public enum Toggle { On = 1, Off = 0 } private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [UsedImplicitly] public string? Category; [UsedImplicitly] public Action<ConfigEntryBase>? CustomDrawer; } internal const string ModName = "sunnfjordheimexp"; internal const string ModVersion = "1.0.3"; internal const string Author = "Zzyzxrd"; private const string ModGUID = "Zzyzxrd.sunnfjordheimexp"; private static string ConfigFileName = "Zzyzxrd.sunnfjordheimexp.cfg"; private static string ConfigFileFullPath; internal static string ConnectionError; private readonly Harmony _harmony = new Harmony("Zzyzxrd.sunnfjordheimexp"); public static readonly ManualLogSource sunnfjordheimexpLogger; private static readonly ConfigSync ConfigSync; private static ConfigEntry<Toggle> _serverConfigLocked; private static ConfigEntry<Toggle> _recipeIsActiveConfig; public void Awake() { Localizer.Load(); _serverConfigLocked = config("1 - General", "Lock Configuration", Toggle.On, "If on, the configuration is locked and can be changed by server admins only."); ConfigSync.AddLockingConfigEntry<Toggle>(_serverConfigLocked); Item item = new Item("sunnfjordheimexp", "Sun_Garrasgogo"); item.Name.English("Gogo Claws"); item.Name.Spanish("Garras Gogo"); item.Description.English("Forged from silver drawn from the veins of the mountains and the remains of the Children of Fenring These claws do not merely cut flesh; they claim the primal spirit of the one who wields them."); item.Description.Spanish("Forjadas con la plata de las venas de la montaña y los restos de los Hijos de Fenring Estas garras no solo cortan la carne; reclaman el espíritu salvaje de aquel que las empuña."); item.Crafting.Add(CraftingTable.Forge, 2); item.RequiredItems.Add("Silver", 18); item.RequiredItems.Add("WolfClaw", 6); item.RequiredItems.Add("BoneFragments", 4); item.RequiredUpgradeItems.Add("Silver", 6); item.CraftAmount = 1; ConfigEntry<Toggle> recipeIsActive = config("Sun_Garrasgogo", "IsRecipeEnabled", Toggle.On, "Enable recipe for Garras Gogo"); item.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive; Item item2 = new Item("sunnfjordheimexp", "SUN_CAPAMANDOCABALLERO"); item2.Name.English("Mandalorian Knight Cloak"); item2.Description.English("A heavy ceremonial cloak worn by Mandalorian knight-warriors."); item2.Name.Spanish("Capa de Caballero Mandaloriano"); item2.Description.Spanish("Una capa ceremonial pesada usada por los caballeros mandalorianos."); item2.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_CAPAMANDOCABALLERO", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item2.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item3 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROCHEST"); item3.Name.English("Golden Chestplate of the Mandalorian Knight"); item3.Description.English("A ceremonial golden chestplate worn by noble Mandalorian knights, symbol of rank and honor."); item3.Name.Spanish("Peto Dorado del Caballero Mandaloriano"); item3.Description.Spanish("Un peto dorado ceremonial usado por nobles caballeros mandalorianos, símbolo de rango y honor."); item3.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROCHEST", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item3.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item4 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROCHESTA"); item4.Name.English("Crystal Chestplate of the Mandalorian Knight"); item4.Description.English("A chestplate forged from reinforced crystal, shimmering with elegant clarity."); item4.Name.Spanish("Peto de Cristal del Caballero Mandaloriano"); item4.Description.Spanish("Un peto forjado en cristal reforzado, brillante y elegante."); item4.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROCHESTA", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item4.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item5 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROCHESTC"); item5.Name.English("Copper Chestplate of the Mandalorian Knight"); item5.Description.English("A chestplate reinforced with tempered copper, durable and reliable in battle."); item5.Name.Spanish("Peto de Cobre del Caballero Mandaloriano"); item5.Description.Spanish("Un peto reforzado con cobre templado, resistente y confiable en combate."); item5.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROCHESTC", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item5.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item6 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROCHESTP"); item6.Name.English("Silver Chestplate of the Mandalorian Knight"); item6.Description.English("A polished silver chestplate worn by ceremonial honor guards."); item6.Name.Spanish("Peto de Plata del Caballero Mandaloriano"); item6.Description.Spanish("Un peto de plata pulida usado por guardias ceremoniales mandalorianos."); item6.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROCHESTP", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item6.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item7 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROCHESTV"); item7.Name.English("Black Metal Chestplate of the Mandalorian Knight"); item7.Description.English("A brutal black metal chestplate favored by seasoned warriors."); item7.Name.Spanish("Peto de Metal Negro del Caballero Mandaloriano"); item7.Description.Spanish("Un peto de metal negro, brutal y usado por guerreros experimentados."); item7.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROCHESTV", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item7.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item8 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROHELMET"); item8.Name.English("Golden Helmet of the Mandalorian Knight"); item8.Description.English("A ceremonial golden helmet symbolizing rank, honor, and Mandalorian tradition."); item8.Name.Spanish("Casco Dorado del Caballero Mandaloriano"); item8.Description.Spanish("Un casco dorado ceremonial que simboliza rango, honor y la tradición mandaloriana."); item8.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROHELMET", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item8.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item9 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROHELMETA"); item9.Name.English("Crystal Helmet of the Mandalorian Knight"); item9.Description.English("A shining helmet crafted from reinforced crystal."); item9.Name.Spanish("Casco de Cristal del Caballero Mandaloriano"); item9.Description.Spanish("Un casco brillante hecho de cristal reforzado."); item9.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROHELMETA", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item9.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item10 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROHELMETC"); item10.Name.English("Copper Helmet of the Mandalorian Knight"); item10.Description.English("A durable helmet reinforced with tempered copper."); item10.Name.Spanish("Casco de Cobre del Caballero Mandaloriano"); item10.Description.Spanish("Un casco resistente reforzado con cobre templado."); item10.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROHELMETC", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item10.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item11 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROHELMETP"); item11.Name.English("Silver Helmet of the Mandalorian Knight"); item11.Description.English("A polished silver helmet worn by ceremonial guards."); item11.Name.Spanish("Casco de Plata del Caballero Mandaloriano"); item11.Description.Spanish("Un casco de plata pulida usado por guardias ceremoniales."); item11.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROHELMETP", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item11.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item12 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROHELMETV"); item12.Name.English("Black Metal Helmet of the Mandalorian Knight"); item12.Description.English("A menacing helmet forged from hardened black metal."); item12.Name.Spanish("Casco de Metal Negro del Caballero Mandaloriano"); item12.Description.Spanish("Un casco imponente forjado en metal negro endurecido."); item12.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROHELMETV", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item12.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item13 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROLEGS"); item13.Name.English("Golden Greaves of the Mandalorian Knight"); item13.Description.English("Ceremonial golden greaves worn by noble Mandalorian knights."); item13.Name.Spanish("Grebas Doradas del Caballero Mandaloriano"); item13.Description.Spanish("Grebas doradas ceremoniales usadas por los nobles caballeros mandalorianos."); item13.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROLEGS", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item13.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item14 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROLEGSA"); item14.Name.English("Crystal Greaves of the Mandalorian Knight"); item14.Description.English("Greaves forged from reinforced crystal, shimmering with refined elegance."); item14.Name.Spanish("Grebas de Cristal del Caballero Mandaloriano"); item14.Description.Spanish("Grebas forjadas en cristal reforzado, brillando con una elegancia refinada."); item14.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROLEGSA", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item14.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item15 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROLEGSP"); item15.Name.English("Silver Greaves of the Mandalorian Knight"); item15.Description.English("Polished silver greaves worn by ceremonial Mandalorian honor guards."); item15.Name.Spanish("Grebas de Plata del Caballero Mandaloriano"); item15.Description.Spanish("Grebas de plata pulida usadas por los guardias ceremoniales mandalorianos."); item15.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROLEGSP", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item15.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item16 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROLEGSV"); item16.Name.English("Black Metal Greaves of the Mandalorian Knight"); item16.Description.English("Greaves forged from hardened black metal, built for harsh battle conditions."); item16.Name.Spanish("Grebas de Metal Negro del Caballero Mandaloriano"); item16.Description.Spanish("Grebas forjadas en metal negro endurecido, hechas para las condiciones más duras del combate."); item16.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROLEGSV", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item16.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item17 = new Item("sunnfjordheimexp", "SUN_MANDOCABALLEROLEGSC"); item17.Name.English("Copper Greaves of the Mandalorian Knight"); item17.Description.English("Greaves reinforced with tempered copper, balanced between protection and mobility."); item17.Name.Spanish("Grebas de Cobre del Caballero Mandaloriano"); item17.Description.Spanish("Grebas reforzadas con cobre templado, equilibradas entre protección y movilidad."); item17.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_MANDOCABALLEROLEGSC", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item17.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item18 = new Item("sunnfjordheimexp", "TRI_ORCOCHESTGRUNT"); item18.Name.English("Brutal Chestplate of the Orc Grunt"); item18.Description.English("A crude but sturdy chestplate worn by frontline orc grunts."); item18.Name.Spanish("Peto Brutal del Orco Raso"); item18.Description.Spanish("Un peto tosco pero resistente, usado por los orcos rasos de primera línea."); item18.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_ORCOCHESTGRUNT", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item18.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item19 = new Item("sunnfjordheimexp", "TRI_ORCOHELMETGRUNT"); item19.Name.English("War Helm of the Orc Grunt"); item19.Description.English("A rugged iron helmet worn by rank-and-file orc warriors."); item19.Name.Spanish("Yelmo de Guerra del Orco Raso"); item19.Description.Spanish("Un yelmo de hierro tosco usado por los guerreros orcos de menor rango."); item19.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_ORCOHELMETGRUNT", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item19.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item20 = new Item("sunnfjordheimexp", "TRI_ORCOLEGSGRUNT"); item20.Name.English("War Greaves of the Orc Grunt"); item20.Description.English("Roughly forged greaves granting basic protection to orc grunts."); item20.Name.Spanish("Grebas de Guerra del Orco Raso"); item20.Description.Spanish("Grebas forjadas de manera rudimentaria que otorgan protección básica al orco raso."); item20.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_ORCOLEGSGRUNT", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item20.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item21 = new Item("sunnfjordheimexp", "TRI_SkullShamanLegs"); item21.Name.English("Bonebound Greaves of the Skull Shaman"); item21.Description.English("Greaves wrapped in bones, fetishes, and dark hides, allowing the Skull Shaman to stride through ritual battlefields."); item21.Name.Spanish("Grebas de Huesos del Chamán Calavera"); item21.Description.Spanish("Grebas envueltas en huesos, fetiches y pieles oscuras, que permiten al Chamán Calavera avanzar por campos de batalla rituales."); item21.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_SkullShamanLegs", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item21.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item22 = new Item("sunnfjordheimexp", "TRI_SkullShamanChest"); item22.Name.English("Boneweaver Chest of the Skull Shaman"); item22.Description.English("A ritual chestpiece woven with bones, channeling ancient shamanic power."); item22.Name.Spanish("Peto Tejedor de Huesos del Chamán Calavera"); item22.Description.Spanish("Un peto ritual tejido con huesos, canalizando antiguo poder chamánico."); item22.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_SkullShamanChest", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item22.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item23 = new Item("sunnfjordheimexp", "TRI_SkullShamanHelm"); item23.Name.English("Skullmask Helm of the Shaman"); item23.Description.English("A terrifying skull helm worn by those who commune with spirits and the dead."); item23.Name.Spanish("Yelmo de Máscara Ósea del Chamán"); item23.Description.Spanish("Un yelmo de calavera aterrador usado por quienes se comunican con espíritus y los muertos."); item23.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_SkullShamanHelm", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item23.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item24 = new Item("sunnfjordheimexp", "TRI_Rexchest"); item24.Name.English("Direbeast Chest of the Rex"); item24.Description.English("A savage chestpiece fashioned from the hide and fangs of the Direbeast. Its presence alone asserts dominance over the wilds."); item24.Name.Spanish("Peto de Bestia Aullante del Rex"); item24.Description.Spanish("Un peto salvaje hecho de piel y colmillos de la Bestia Aullante. Su sola presencia impone dominio sobre las tierras salvajes."); item24.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Rexchest", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item24.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item25 = new Item("sunnfjordheimexp", "TRI_Rexhelmet"); item25.Name.English("Direbeast Helm of the Rex"); item25.Description.English("A terrifying helm shaped like the snarling head of the Direbeast, worn only by apex hunters of the Rex tribe."); item25.Name.Spanish("Yelmo de Bestia Aullante del Rex"); item25.Description.Spanish("Un yelmo aterrador con la forma de la cabeza enfurecida de la Bestia Aullante, usado solo por los cazadores supremos del clan Rex."); item25.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Rexhelmet", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item25.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item26 = new Item("sunnfjordheimexp", "TRI_Rexlegs"); item26.Name.English("Direbeast Greaves of the Rex"); item26.Description.English("Greaves reinforced with bone plates and dark fur, crafted to enhance the brutal agility of Rex warriors."); item26.Name.Spanish("Grebas de Bestia Aullante del Rex"); item26.Description.Spanish("Grebas reforzadas con placas óseas y pelaje oscuro, hechas para potenciar la agilidad brutal de los guerreros Rex."); item26.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Rexlegs", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item26.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item27 = new Item("sunnfjordheimexp", "TRI_DruidatribalCape"); item27.Name.English("Feathered Cloak of the Tribal Druid"); item27.Description.English("A cloak adorned with ritual feathers and wild furs, worn by druids who walk in harmony with the untamed world."); item27.Name.Spanish("Capa Plumeada del Druida Tribal"); item27.Description.Spanish("Una capa adornada con plumas rituales y pieles salvajes, usada por druidas que caminan en armonía con el mundo indómito."); item27.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_DruidatribalCape", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item27.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item28 = new Item("sunnfjordheimexp", "TRI_DruidatribalChest"); item28.Name.English("Wildheart Chest of the Tribal Druid"); item28.Description.English("A chestpiece crafted from layered leather, bones, and ceremonial feathers, channeling the strength of the living forest."); item28.Name.Spanish("Peto del Corazón Salvaje del Druida Tribal"); item28.Description.Spanish("Un peto hecho de cuero trenzado, huesos y plumas ceremoniales, que canaliza la fuerza del bosque viviente."); item28.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_DruidatribalChest", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item28.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item29 = new Item("sunnfjordheimexp", "TRI_Druidatribalhelmet"); item29.Name.English("Antler Crown of the Tribal Druid"); item29.Description.English("A ceremonial helm crowned with carved antlers, symbolizing unity between druid and spirit-beast."); item29.Name.Spanish("Corona de Astas del Druida Tribal"); item29.Description.Spanish("Un yelmo ceremonial coronado con astas talladas, símbolo de la unión entre el druida y el espíritu bestial."); item29.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Druidatribalhelmet", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item29.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item30 = new Item("sunnfjordheimexp", "TRI_Druidatriballegs"); item30.Name.English("Wildstride Greaves of the Tribal Druid"); item30.Description.English("Light, flexible greaves made for silent travel through dense forests and sacred groves."); item30.Name.Spanish("Grebas de Zancada Salvaje del Druida Tribal"); item30.Description.Spanish("Grebas ligeras y flexibles hechas para desplazarse en silencio por bosques densos y arboledas sagradas."); item30.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Druidatriballegs", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item30.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item31 = new Item("sunnfjordheimexp", "SUN_BeskarDagger"); item31.Name.English("Beskar Dagger"); item31.Description.English("A dagger forged from pure Beskar, light yet indestructible."); item31.Name.Spanish("Daga de Beskar"); item31.Description.Spanish("Una daga forjada en puro Beskar, liviana pero indestructible."); item31.Crafting.Add(CraftingTable.Forge, 4); item31.RequiredItems.Add("BlackMetal", 10); item31.RequiredItems.Add("LinenThread", 5); item31.RequiredItems.Add("FineWood", 2); item31.RequiredUpgradeItems.Add("BlackMetal", 5); item31.RequiredUpgradeItems.Add("LinenThread", 3); item31.CraftAmount = 1; item31.Snapshot(); _recipeIsActiveConfig = config("SUN_BeskarDagger", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item31.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item32 = new Item("sunnfjordheimexp", "SUN_BeskarDagger2H"); item32.Name.English("Beskar Great Dagger"); item32.Description.English("A massive Beskar blade, wielded with both hands. Nearly unbreakable."); item32.Name.Spanish("Gran Daga de Beskar"); item32.Description.Spanish("Una enorme hoja de Beskar, empuñada con ambas manos. Prácticamente irrompible."); item32.Crafting.Add(CraftingTable.Forge, 4); item32.RequiredItems.Add("BlackMetal", 20); item32.RequiredItems.Add("LinenThread", 8); item32.RequiredItems.Add("FineWood", 5); item32.RequiredUpgradeItems.Add("BlackMetal", 10); item32.RequiredUpgradeItems.Add("LinenThread", 5); item32.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_BeskarDagger2H", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item32.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item33 = new Item("sunnfjordheimexp", "SUN_beskarSWORD"); item33.Name.English("Beskar Sword"); item33.Description.English("A sword forged from pure Beskar alloy, empowered with Mistlands eitr."); item33.Name.Spanish("Espada de Beskar"); item33.Description.Spanish("Una espada forjada en aleación de Beskar, potenciada con eitr de las Tierras Neblinosas."); item33.Crafting.Add(CraftingTable.BlackForge, 1); item33.RequiredItems.Add("BlackMetal", 10); item33.RequiredItems.Add("Eitr", 5); item33.RequiredItems.Add("Mandible", 3); item33.RequiredUpgradeItems.Add("Mandible", 5); item33.RequiredUpgradeItems.Add("Eitr", 2); item33.CraftAmount = 1; item33.Snapshot(); _recipeIsActiveConfig = config("SUN_beskarSWORD", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item33.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item34 = new Item("sunnfjordheimexp", "SUN_beskarSWORD1"); item34.Name.English("Beskar Eitrblade"); item34.Description.English("An enhanced Beskar blade infused with concentrated eitr, humming with arcane power."); item34.Name.Spanish("Hoja de Beskar Eitr"); item34.Description.Spanish("Una hoja de Beskar mejorada, infundida con eitr concentrado y cargada de poder arcano."); item34.Crafting.Add(CraftingTable.BlackForge, 1); item34.RequiredItems.Add("BlackMetal", 10); item34.RequiredItems.Add("Eitr", 5); item34.RequiredItems.Add("Mandible", 3); item34.RequiredUpgradeItems.Add("Mandible", 5); item34.RequiredUpgradeItems.Add("Eitr", 2); item34.CraftAmount = 1; _recipeIsActiveConfig = config("SUN_beskarSWORD1", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item34.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item34.Snapshot(); Item item35 = new Item("sunnfjordheimexp", "Sun_Daedrifist"); item35.Name.English("Daedri Fist"); item35.Description.English("A brutal Ashlands weapon forged in daedric fire, radiating raw destructive force."); item35.Name.Spanish("Puño Daedri"); item35.Description.Spanish("Un arma brutal de Ashlands forjada en fuego daédrico, que irradia una fuerza destructiva pura."); item35.Crafting.Add(CraftingTable.BlackForge, 1); item35.RequiredItems.Add("FlametalNew", 12); item35.RequiredItems.Add("Eitr", 8); item35.RequiredItems.Add("CharredBone", 5); item35.RequiredUpgradeItems.Add("FlametalNew", 6); item35.RequiredUpgradeItems.Add("Eitr", 4); item35.RequiredUpgradeItems.Add("CharredBone", 3); item35.CraftAmount = 1; _recipeIsActiveConfig = config("Sun_Daedrifist", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item35.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item36 = new Item("sunnfjordheimexp", "TRI_ARCOORCO"); item36.Name.English("Orc Ashlands Warbow"); item36.Description.English("A savage orcish warbow forged in the fires of Ashlands, built to pierce even daedric armor."); item36.Name.Spanish("Arco de Guerra Orco de Ashlands"); item36.Description.Spanish("Un arco de guerra orco forjado en los fuegos de Ashlands, capaz de perforar incluso armaduras daédricas."); item36.Crafting.Add(CraftingTable.BlackForge, 1); item36.RequiredItems.Add("FlametalNew", 12); item36.RequiredItems.Add("FineWood", 14); item36.RequiredItems.Add("CharredBone", 6); item36.RequiredUpgradeItems.Add("FlametalNew", 6); item36.RequiredUpgradeItems.Add("CharredBone", 4); item36.RequiredUpgradeItems.Add("Eitr", 3); item36.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_ARCOORCO", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item36.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item36.Snapshot(); Item item37 = new Item("sunnfjordheimexp", "TRI_AtgeirOrco"); item37.Name.English("Orc Ashlands Atgeir"); item37.Description.English("A massive orcish atgeir forged in the fires of Ashlands, designed to break enemy lines."); item37.Name.Spanish("Atgeir Orco de Ashlands"); item37.Description.Spanish("Un enorme atgeir orco forjado en los fuegos de Ashlands, diseñado para romper formaciones enemigas."); item37.Crafting.Add(CraftingTable.BlackForge, 1); item37.RequiredItems.Add("FlametalNew", 14); item37.RequiredItems.Add("BlackMetal", 6); item37.RequiredItems.Add("CharredBone", 6); item37.RequiredUpgradeItems.Add("FlametalNew", 7); item37.RequiredUpgradeItems.Add("CharredBone", 4); item37.RequiredUpgradeItems.Add("Eitr", 3); item37.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_AtgeirOrco", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item37.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item37.Snapshot(); Item item38 = new Item("sunnfjordheimexp", "TRI_DagaOrco"); item38.Name.English("Orc Ashlands Dagger"); item38.Description.English("A vicious orcish dagger forged in the infernal fires of Ashlands."); item38.Name.Spanish("Daga Orco de Ashlands"); item38.Description.Spanish("Una daga orca despiadada forjada en los fuegos infernales de Ashlands."); item38.Crafting.Add(CraftingTable.BlackForge, 1); item38.RequiredItems.Add("FlametalNew", 6); item38.RequiredItems.Add("BlackMetal", 4); item38.RequiredItems.Add("CharredBone", 3); item38.RequiredUpgradeItems.Add("FlametalNew", 3); item38.RequiredUpgradeItems.Add("CharredBone", 2); item38.RequiredUpgradeItems.Add("Eitr", 2); item38.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_DagaOrco", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item38.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item38.Snapshot(); Item item39 = new Item("sunnfjordheimexp", "TRI_Espadaorca"); item39.Name.English("Orc Ashlands Sword"); item39.Description.English("A heavy orcish sword forged in Ashlands, combining brute force with molten steel."); item39.Name.Spanish("Espada Orco de Ashlands"); item39.Description.Spanish("Una espada orca pesada forjada en Ashlands, que combina fuerza bruta con acero fundido."); item39.Crafting.Add(CraftingTable.BlackForge, 1); item39.RequiredItems.Add("FlametalNew", 10); item39.RequiredItems.Add("BlackMetal", 6); item39.RequiredItems.Add("CharredBone", 5); item39.RequiredUpgradeItems.Add("FlametalNew", 5); item39.RequiredUpgradeItems.Add("CharredBone", 3); item39.RequiredUpgradeItems.Add("Eitr", 3); item39.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Espadaorca", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item39.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item39.Snapshot(); Item item40 = new Item("sunnfjordheimexp", "TRI_Granespadonorco"); item40.Name.English("Orc Ashlands Greatsword"); item40.Description.English("A colossal orcish greatsword born in Ashlands, capable of cleaving enemies in half."); item40.Name.Spanish("Gran Espada Orco de Ashlands"); item40.Description.Spanish("Una colosal gran espada orca nacida en Ashlands, capaz de partir enemigos en dos."); item40.Crafting.Add(CraftingTable.BlackForge, 1); item40.RequiredItems.Add("FlametalNew", 16); item40.RequiredItems.Add("BlackMetal", 8); item40.RequiredItems.Add("CharredBone", 8); item40.RequiredUpgradeItems.Add("FlametalNew", 8); item40.RequiredUpgradeItems.Add("CharredBone", 5); item40.RequiredUpgradeItems.Add("Eitr", 4); item40.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Granespadonorco", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item40.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item40.Snapshot(); Item item41 = new Item("sunnfjordheimexp", "TRI_GranHachaorca"); item41.Name.English("Orc Ashlands Greataxe"); item41.Description.English("A colossal orcish greataxe forged in the fires of Ashlands."); item41.Name.Spanish("Gran Hacha Orco de Ashlands"); item41.Description.Spanish("Una colosal gran hacha orca forjada en los fuegos de Ashlands."); item41.Crafting.Add(CraftingTable.BlackForge, 1); item41.RequiredItems.Add("FlametalNew", 18); item41.RequiredItems.Add("BlackMetal", 8); item41.RequiredItems.Add("CharredBone", 8); item41.RequiredUpgradeItems.Add("FlametalNew", 9); item41.RequiredUpgradeItems.Add("CharredBone", 5); item41.RequiredUpgradeItems.Add("Eitr", 4); item41.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_GranHachaorca", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item41.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item41.Snapshot(); Item item42 = new Item("sunnfjordheimexp", "TRI_HachaOrca"); item42.Name.English("Orc Ashlands Axe"); item42.Description.English("A brutal orcish axe tempered in Ashlands."); item42.Name.Spanish("Hacha Orco de Ashlands"); item42.Description.Spanish("Un hacha orca brutal templada en Ashlands."); item42.Crafting.Add(CraftingTable.BlackForge, 1); item42.RequiredItems.Add("FlametalNew", 10); item42.RequiredItems.Add("BlackMetal", 6); item42.RequiredItems.Add("CharredBone", 5); item42.RequiredUpgradeItems.Add("FlametalNew", 5); item42.RequiredUpgradeItems.Add("CharredBone", 3); item42.RequiredUpgradeItems.Add("Eitr", 3); item42.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_HachaOrca", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item42.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item42.Snapshot(); Item item43 = new Item("sunnfjordheimexp", "TRI_Mazoorco"); item43.Name.English("Orc Ashlands Mace"); item43.Description.English("A crushing orcish mace forged in Ashlands."); item43.Name.Spanish("Maza Orco de Ashlands"); item43.Description.Spanish("Una maza orca demoledora forjada en Ashlands."); item43.Crafting.Add(CraftingTable.BlackForge, 1); item43.RequiredItems.Add("FlametalNew", 12); item43.RequiredItems.Add("BlackMetal", 6); item43.RequiredItems.Add("CharredBone", 6); item43.RequiredUpgradeItems.Add("FlametalNew", 6); item43.RequiredUpgradeItems.Add("CharredBone", 4); item43.RequiredUpgradeItems.Add("Eitr", 3); item43.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Mazoorco", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item43.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item43.Snapshot(); Item item44 = new Item("sunnfjordheimexp", "Tri_Mazoorcoh1"); item44.Name.English("Orc Ashlands Heavy Mace"); item44.Description.English("A heavy one-handed orcish mace radiating Ashlands heat."); item44.Name.Spanish("Maza Pesada Orco de Ashlands"); item44.Description.Spanish("Una maza orca pesada de una mano que irradia el calor de Ashlands."); item44.Crafting.Add(CraftingTable.BlackForge, 1); item44.RequiredItems.Add("FlametalNew", 14); item44.RequiredItems.Add("BlackMetal", 7); item44.RequiredItems.Add("CharredBone", 6); item44.RequiredUpgradeItems.Add("FlametalNew", 7); item44.RequiredUpgradeItems.Add("CharredBone", 4); item44.RequiredUpgradeItems.Add("Eitr", 3); item44.CraftAmount = 1; _recipeIsActiveConfig = config("Tri_Mazoorcoh1", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item44.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item44.Snapshot(); Item item45 = new Item("sunnfjordheimexp", "TRI_stafforco"); item45.Name.English("Orc Ashlands Staff"); item45.Description.English("An orcish staff infused with Ashlands fire and corrupted eitr."); item45.Name.Spanish("Bastón Orco de Ashlands"); item45.Description.Spanish("Un bastón orco infundido con fuego de Ashlands y eitr corrompido."); item45.Crafting.Add(CraftingTable.BlackForge, 1); item45.RequiredItems.Add("FlametalNew", 8); item45.RequiredItems.Add("Eitr", 10); item45.RequiredItems.Add("CharredBone", 6); item45.RequiredUpgradeItems.Add("FlametalNew", 4); item45.RequiredUpgradeItems.Add("Eitr", 5); item45.RequiredUpgradeItems.Add("CharredBone", 4); item45.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_stafforco", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item45.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item45.Snapshot(); Item item46 = new Item("sunnfjordheimexp", "TRI_Greatorcoshield"); item46.Name.English("Orc Ashlands Greatshield"); item46.Description.English("A massive orcish greatshield forged in Ashlands, capable of withstanding devastating blows."); item46.Name.Spanish("Gran Escudo Orco de Ashlands"); item46.Description.Spanish("Un enorme escudo orco forjado en Ashlands, capaz de resistir golpes devastadores."); item46.Crafting.Add(CraftingTable.BlackForge, 1); item46.RequiredItems.Add("FlametalNew", 18); item46.RequiredItems.Add("BlackMetal", 10); item46.RequiredItems.Add("CharredBone", 8); item46.RequiredUpgradeItems.Add("FlametalNew", 9); item46.RequiredUpgradeItems.Add("CharredBone", 5); item46.RequiredUpgradeItems.Add("Eitr", 4); item46.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Greatorcoshield", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item46.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item46.Snapshot(); Item item47 = new Item("sunnfjordheimexp", "TRI_Shielmediumorc"); item47.Name.English("Orc Ashlands Shield"); item47.Description.English("A sturdy orcish shield hardened by the flames of Ashlands."); item47.Name.Spanish("Escudo Orco de Ashlands"); item47.Description.Spanish("Un resistente escudo orco endurecido por las llamas de Ashlands."); item47.Crafting.Add(CraftingTable.BlackForge, 1); item47.RequiredItems.Add("FlametalNew", 12); item47.RequiredItems.Add("BlackMetal", 8); item47.RequiredItems.Add("CharredBone", 6); item47.RequiredUpgradeItems.Add("FlametalNew", 6); item47.RequiredUpgradeItems.Add("CharredBone", 4); item47.RequiredUpgradeItems.Add("Eitr", 3); item47.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_Shielmediumorc", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item47.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item47.Snapshot(); Item item48 = new Item("sunnfjordheimexp", "TRI_SmallOrcoshield"); item48.Name.English("Orc Ashlands Buckler"); item48.Description.English("A compact orcish shield designed for aggressive Ashlands combat."); item48.Name.Spanish("Escudo Pequeño Orco de Ashlands"); item48.Description.Spanish("Un escudo orco compacto diseñado para un combate agresivo en Ashlands."); item48.Crafting.Add(CraftingTable.BlackForge, 1); item48.RequiredItems.Add("FlametalNew", 8); item48.RequiredItems.Add("BlackMetal", 6); item48.RequiredItems.Add("CharredBone", 5); item48.RequiredUpgradeItems.Add("FlametalNew", 4); item48.RequiredUpgradeItems.Add("CharredBone", 3); item48.RequiredUpgradeItems.Add("Eitr", 3); item48.CraftAmount = 1; _recipeIsActiveConfig = config("TRI_SmallOrcoshield", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item48.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; item48.Snapshot(); Item item49 = new Item("sunnfjordheimexp", "TRI_AtgeirAshlandsSoulreaver"); item49.Name.English("Soulreaver Atgeir"); item49.Description.English("Forged from the shattered remains of a soul-devouring blade, this atgeir was reforged in Ashlands. It whispers of fallen kings, broken oaths, and the countless souls it once claimed."); item49.Name.Spanish("Atgeir Devora almas"); item49.Description.Spanish("Forjado a partir de los restos destrozados de una hoja devoradora de almas, este atgeir fue reforjado en Ashlands. Susurra sobre reyes caídos, juramentos rotos y las innumerables almas que reclamó."); item49.Crafting.Add(CraftingTable.BlackForge, 1); item49.RequiredItems.Add("FlametalNew", 16); item49.RequiredItems.Add("Eitr", 10); item49.RequiredItems.Add("CharredBone", 8); item49.RequiredUpgradeItems.Add("FlametalNew", 8); item49.RequiredUpgradeItems.Add("Eitr", 5); item49.RequiredUpgradeItems.Add("CharredBone", 5); item49.CraftAmount = 1; item49.Snapshot(); _recipeIsActiveConfig = config("TRI_AtgeirAshlandsSoulreaver", "IsRecipeEnabled", Toggle.On, "Enables crafting for this item."); item49.RecipeIsActive = (ConfigEntryBase?)(object)_recipeIsActiveConfig; Item item50 = new Item("medievaleras", "VKE_Vikingmontainchest"); item50.Name.English("Mountain Viking Chest"); item50.Name.Spanish("Pechera Vikinga de Montaña"); item50.Description.English("A heavy chestpiece forged to withstand the frozen winds of the mountains."); item50.Description.Spanish("Una pechera pesada forjada para resistir los vientos helados de la montaña."); item50.Crafting.Add(CraftingTable.Forge, 2); item50.RequiredItems.Add("Silver", 26); item50.RequiredItems.Add("WolfPelt", 6); item50.RequiredUpgradeItems.Add("Silver", 8); item50.CraftAmount = 1; SharedData shared = item50.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared.m_armor = 20f; shared.m_armorPerLevel = 4f; shared.m_weight = 6f; shared.m_maxQuality = 4; shared.m_maxDurability = 1400f; shared.m_durabilityPerLevel = 260f; ConfigEntry<Toggle> recipeIsActive2 = config("VKE_Vikingmontainchest", "IsRecipeEnabled", Toggle.On, "Enable recipe for Mountain Viking Chest"); item50.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive2; MaterialReplacer.RegisterGameObjectForShaderSwap(item50.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item51 = new Item("medievaleras", "VKE_Vikingmontainhelmet"); item51.Name.English("Mountain Viking Helmet"); item51.Name.Spanish("Casco Vikingo de Montaña"); item51.Description.English("A sturdy helmet crafted for warriors of the frozen peaks."); item51.Description.Spanish("Un casco resistente forjado para los guerreros de las cumbres heladas."); item51.Crafting.Add(CraftingTable.Forge, 2); item51.RequiredItems.Add("Silver", 18); item51.RequiredItems.Add("WolfPelt", 4); item51.RequiredUpgradeItems.Add("Silver", 6); item51.CraftAmount = 1; SharedData shared2 = item51.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared2.m_armor = 14f; shared2.m_armorPerLevel = 3f; shared2.m_weight = 3f; shared2.m_maxQuality = 4; shared2.m_maxDurability = 1100f; shared2.m_durabilityPerLevel = 200f; ConfigEntry<Toggle> recipeIsActive3 = config("VKE_Vikingmontainhelmet", "IsRecipeEnabled", Toggle.On, "Enable recipe for Mountain Viking Helmet"); item51.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive3; MaterialReplacer.RegisterGameObjectForShaderSwap(item51.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item52 = new Item("medievaleras", "VKE_Vikingmontainlegs"); item52.Name.English("Mountain Viking Legs"); item52.Name.Spanish("Grebas Vikingas de Montaña"); item52.Description.English("Heavy leggings designed for harsh mountain climates."); item52.Description.Spanish("Grebas pesadas diseñadas para los climas montañosos más hostiles."); item52.Crafting.Add(CraftingTable.Forge, 2); item52.RequiredItems.Add("Silver", 22); item52.RequiredItems.Add("WolfPelt", 5); item52.RequiredUpgradeItems.Add("Silver", 7); item52.CraftAmount = 1; SharedData shared3 = item52.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared3.m_armor = 16f; shared3.m_armorPerLevel = 3f; shared3.m_weight = 5f; shared3.m_maxQuality = 4; shared3.m_maxDurability = 1300f; shared3.m_durabilityPerLevel = 230f; ConfigEntry<Toggle> recipeIsActive4 = config("VKE_Vikingmontainlegs", "IsRecipeEnabled", Toggle.On, "Enable recipe for Mountain Viking Legs"); item52.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive4; MaterialReplacer.RegisterGameObjectForShaderSwap(item52.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item53 = new Item("medievaleras", "VKE_Vikignmontaincape"); item53.Name.English("Mountain Viking Cape"); item53.Name.Spanish("Capa Vikinga de Montaña"); item53.Description.English("A thick fur-lined cape offering protection against icy winds."); item53.Description.Spanish("Una capa gruesa forrada en piel que protege de los vientos helados."); item53.Crafting.Add(CraftingTable.Workbench, 2); item53.RequiredItems.Add("WolfPelt", 10); item53.RequiredItems.Add("Silver", 8); item53.RequiredUpgradeItems.Add("WolfPelt", 5); item53.CraftAmount = 1; SharedData shared4 = item53.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared4.m_armor = 2f; shared4.m_armorPerLevel = 1f; shared4.m_weight = 2f; shared4.m_maxQuality = 4; shared4.m_maxDurability = 900f; shared4.m_durabilityPerLevel = 180f; ConfigEntry<Toggle> recipeIsActive5 = config("VKE_Vikignmontaincape", "IsRecipeEnabled", Toggle.On, "Enable recipe for Mountain Viking Cape"); item53.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive5; MaterialReplacer.RegisterGameObjectForShaderSwap(item53.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item54 = new Item("medievaleras", "VKE_Vikingbearchest"); item54.Name.English("Bear Viking Chest"); item54.Name.Spanish("Pechera Vikinga del Oso"); item54.Description.English("A heavy chestpiece made from bear hide, favored by the fiercest mountain warriors."); item54.Description.Spanish("Una pechera pesada hecha con piel de oso, usada por los guerreros más feroces de la montaña."); item54.Crafting.Add(CraftingTable.Forge, 2); item54.RequiredItems.Add("Silver", 28); item54.RequiredItems.Add("WolfPelt", 4); item54.RequiredItems.Add("LeatherScraps", 6); item54.RequiredUpgradeItems.Add("Silver", 9); item54.CraftAmount = 1; SharedData shared5 = item54.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared5.m_armor = 22f; shared5.m_armorPerLevel = 4f; shared5.m_weight = 7f; shared5.m_maxQuality = 4; shared5.m_maxDurability = 1500f; shared5.m_durabilityPerLevel = 280f; ConfigEntry<Toggle> recipeIsActive6 = config("VKE_Vikingbearchest", "IsRecipeEnabled", Toggle.On, "Enable recipe for Bear Viking Chest"); item54.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive6; MaterialReplacer.RegisterGameObjectForShaderSwap(item54.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item55 = new Item("medievaleras", "VKE_Vikingbearhelmet"); item55.Name.English("Bear Viking Helmet"); item55.Name.Spanish("Casco Vikingo del Oso"); item55.Description.English("A fearsome helmet adorned with bear motifs, symbol of raw strength."); item55.Description.Spanish("Un casco temible adornado con motivos de oso, símbolo de fuerza bruta."); item55.Crafting.Add(CraftingTable.Forge, 2); item55.RequiredItems.Add("Silver", 20); item55.RequiredItems.Add("LeatherScraps", 8); item55.RequiredUpgradeItems.Add("Silver", 7); item55.CraftAmount = 1; SharedData shared6 = item55.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared6.m_armor = 15f; shared6.m_armorPerLevel = 3f; shared6.m_weight = 3.5f; shared6.m_maxQuality = 4; shared6.m_maxDurability = 1150f; shared6.m_durabilityPerLevel = 210f; ConfigEntry<Toggle> recipeIsActive7 = config("VKE_Vikingbearhelmet", "IsRecipeEnabled", Toggle.On, "Enable recipe for Bear Viking Helmet"); item55.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive7; MaterialReplacer.RegisterGameObjectForShaderSwap(item55.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item56 = new Item("medievaleras", "VKE_Vikingbearlegs"); item56.Name.English("Bear Viking Legs"); item56.Name.Spanish("Grebas Vikingas del Oso"); item56.Description.English("Sturdy leg armor reinforced with thick bear hide."); item56.Description.Spanish("Grebas robustas reforzadas con gruesa piel de oso."); item56.Crafting.Add(CraftingTable.Forge, 2); item56.RequiredItems.Add("Silver", 24); item56.RequiredItems.Add("LeatherScraps", 10); item56.RequiredUpgradeItems.Add("Silver", 8); item56.CraftAmount = 1; SharedData shared7 = item56.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared7.m_armor = 17f; shared7.m_armorPerLevel = 3f; shared7.m_weight = 5.5f; shared7.m_maxQuality = 4; shared7.m_maxDurability = 1350f; shared7.m_durabilityPerLevel = 240f; ConfigEntry<Toggle> recipeIsActive8 = config("VKE_Vikingbearlegs", "IsRecipeEnabled", Toggle.On, "Enable recipe for Bear Viking Legs"); item56.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive8; MaterialReplacer.RegisterGameObjectForShaderSwap(item56.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item57 = new Item("medievaleras", "VKE_Vikignbearcape"); item57.Name.English("Bear Viking Cape"); item57.Name.Spanish("Capa Vikinga del Oso"); item57.Description.English("A massive bear-fur cape that radiates primal strength."); item57.Description.Spanish("Una enorme capa de piel de oso que irradia fuerza primitiva."); item57.Crafting.Add(CraftingTable.Workbench, 2); item57.RequiredItems.Add("WolfPelt", 6); item57.RequiredItems.Add("LeatherScraps", 12); item57.RequiredUpgradeItems.Add("WolfPelt", 4); item57.CraftAmount = 1; SharedData shared8 = item57.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared8.m_armor = 3f; shared8.m_armorPerLevel = 1f; shared8.m_weight = 2.5f; shared8.m_maxQuality = 4; shared8.m_maxDurability = 950f; shared8.m_durabilityPerLevel = 190f; ConfigEntry<Toggle> recipeIsActive9 = config("VKE_Vikignbearcape", "IsRecipeEnabled", Toggle.On, "Enable recipe for Bear Viking Cape"); item57.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive9; MaterialReplacer.RegisterGameObjectForShaderSwap(item57.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item58 = new Item("medievaleras", "VKE_Villagechest"); item58.Name.English("Village Chest"); item58.Name.Spanish("Pechera Aldeana"); item58.Description.English("A simple chestpiece worn by villagers and common folk."); item58.Description.Spanish("Una pechera sencilla usada por aldeanos y gente común."); item58.Crafting.Add(CraftingTable.Workbench, 2); item58.RequiredItems.Add("LeatherScraps", 10); item58.RequiredItems.Add("DeerHide", 6); item58.RequiredUpgradeItems.Add("LeatherScraps", 5); item58.CraftAmount = 1; SharedData shared9 = item58.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared9.m_armor = 8f; shared9.m_armorPerLevel = 2f; shared9.m_weight = 3.5f; shared9.m_maxQuality = 4; shared9.m_maxDurability = 900f; shared9.m_durabilityPerLevel = 180f; ConfigEntry<Toggle> recipeIsActive10 = config("VKE_Villagechest", "IsRecipeEnabled", Toggle.On, "Enable recipe for Village Chest"); item58.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive10; MaterialReplacer.RegisterGameObjectForShaderSwap(item58.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item59 = new Item("medievaleras", "VKE_Villagelegs"); item59.Name.English("Village Legs"); item59.Name.Spanish("Pantalones Aldeanos"); item59.Description.English("Simple legwear made for daily work in the village."); item59.Description.Spanish("Ropa sencilla para las piernas, hecha para el trabajo diario en la aldea."); item59.Crafting.Add(CraftingTable.Workbench, 2); item59.RequiredItems.Add("LeatherScraps", 8); item59.RequiredItems.Add("DeerHide", 4); item59.RequiredUpgradeItems.Add("LeatherScraps", 4); item59.CraftAmount = 1; SharedData shared10 = item59.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared10.m_armor = 6f; shared10.m_armorPerLevel = 2f; shared10.m_weight = 3f; shared10.m_maxQuality = 4; shared10.m_maxDurability = 850f; shared10.m_durabilityPerLevel = 160f; ConfigEntry<Toggle> recipeIsActive11 = config("VKE_Villagelegs", "IsRecipeEnabled", Toggle.On, "Enable recipe for Village Legs"); item59.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive11; MaterialReplacer.RegisterGameObjectForShaderSwap(item59.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item60 = new Item("medievaleras", "VKE_Vikingclanchest"); item60.Name.English("Viking Clan Chest"); item60.Name.Spanish("Pechera del Clan Vikingo"); item60.Description.English("A chestpiece bearing the marks and colors of a proud viking clan."); item60.Description.Spanish("Una pechera que porta las marcas y colores de un orgulloso clan vikingo."); item60.Crafting.Add(CraftingTable.Forge, 2); item60.RequiredItems.Add("Silver", 24); item60.RequiredItems.Add("WolfPelt", 5); item60.RequiredItems.Add("LeatherScraps", 6); item60.RequiredUpgradeItems.Add("Silver", 8); item60.CraftAmount = 1; SharedData shared11 = item60.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared11.m_armor = 18f; shared11.m_armorPerLevel = 3f; shared11.m_weight = 6f; shared11.m_maxQuality = 4; shared11.m_maxDurability = 1350f; shared11.m_durabilityPerLevel = 240f; ConfigEntry<Toggle> recipeIsActive12 = config("VKE_Vikingclanchest", "IsRecipeEnabled", Toggle.On, "Enable recipe for Viking Clan Chest"); item60.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive12; MaterialReplacer.RegisterGameObjectForShaderSwap(item60.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item61 = new Item("medievaleras", "VKE_Vikingclanhelmet"); item61.Name.English("Viking Clan Helmet"); item61.Name.Spanish("Casco del Clan Vikingo"); item61.Description.English("A helmet worn by seasoned warriors of the viking clans."); item61.Description.Spanish("Un casco usado por los guerreros experimentados de los clanes vikingos."); item61.Crafting.Add(CraftingTable.Forge, 2); item61.RequiredItems.Add("Silver", 18); item61.RequiredItems.Add("LeatherScraps", 8); item61.RequiredUpgradeItems.Add("Silver", 6); item61.CraftAmount = 1; SharedData shared12 = item61.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared12.m_armor = 14f; shared12.m_armorPerLevel = 3f; shared12.m_weight = 3.5f; shared12.m_maxQuality = 4; shared12.m_maxDurability = 1100f; shared12.m_durabilityPerLevel = 200f; ConfigEntry<Toggle> recipeIsActive13 = config("VKE_Vikingclanhelmet", "IsRecipeEnabled", Toggle.On, "Enable recipe for Viking Clan Helmet"); item61.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive13; MaterialReplacer.RegisterGameObjectForShaderSwap(item61.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item62 = new Item("medievaleras", "VKE_Vikingclanlegs"); item62.Name.English("Viking Clan Legs"); item62.Name.Spanish("Grebas del Clan Vikingo"); item62.Description.English("Leg armor crafted for long marches and clan warfare."); item62.Description.Spanish("Armadura para las piernas forjada para largas marchas y guerras de clan."); item62.Crafting.Add(CraftingTable.Forge, 2); item62.RequiredItems.Add("Silver", 22); item62.RequiredItems.Add("LeatherScraps", 10); item62.RequiredUpgradeItems.Add("Silver", 7); item62.CraftAmount = 1; SharedData shared13 = item62.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared13.m_armor = 16f; shared13.m_armorPerLevel = 3f; shared13.m_weight = 5.5f; shared13.m_maxQuality = 4; shared13.m_maxDurability = 1300f; shared13.m_durabilityPerLevel = 230f; ConfigEntry<Toggle> recipeIsActive14 = config("VKE_Vikingclanlegs", "IsRecipeEnabled", Toggle.On, "Enable recipe for Viking Clan Legs"); item62.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive14; MaterialReplacer.RegisterGameObjectForShaderSwap(item62.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item63 = new Item("medievaleras", "VKE_Vikignclancape"); item63.Name.English("Viking Clan Cape"); item63.Name.Spanish("Capa del Clan Vikingo"); item63.Description.English("A ceremonial cape representing loyalty to a viking clan."); item63.Description.Spanish("Una capa ceremonial que representa la lealtad a un clan vikingo."); item63.Crafting.Add(CraftingTable.Workbench, 2); item63.RequiredItems.Add("WolfPelt", 6); item63.RequiredItems.Add("LeatherScraps", 10); item63.RequiredUpgradeItems.Add("WolfPelt", 4); item63.CraftAmount = 1; SharedData shared14 = item63.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared14.m_armor = 3f; shared14.m_armorPerLevel = 1f; shared14.m_weight = 2.5f; shared14.m_maxQuality = 4; shared14.m_maxDurability = 950f; shared14.m_durabilityPerLevel = 190f; ConfigEntry<Toggle> recipeIsActive15 = config("VKE_Vikignclancape", "IsRecipeEnabled", Toggle.On, "Enable recipe for Viking Clan Cape"); item63.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive15; MaterialReplacer.RegisterGameObjectForShaderSwap(item63.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item64 = new Item("medievaleras", "VKE_VikingWolfHelmet"); item64.Name.English("Viking Wolf Helmet"); item64.Name.Spanish("Casco Vikingo del Lobo"); item64.Description.English("A fierce helmet crafted from wolf hide, worn by hunters of the frozen lands."); item64.Description.Spanish("Un casco feroz hecho con piel de lobo, usado por cazadores de las tierras heladas."); item64.Crafting.Add(CraftingTable.Forge, 2); item64.RequiredItems.Add("Silver", 20); item64.RequiredItems.Add("WolfPelt", 6); item64.RequiredUpgradeItems.Add("Silver", 6); item64.CraftAmount = 1; SharedData shared15 = item64.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared15.m_armor = 15f; shared15.m_armorPerLevel = 3f; shared15.m_weight = 3.5f; shared15.m_maxQuality = 4; shared15.m_maxDurability = 1150f; shared15.m_durabilityPerLevel = 210f; ConfigEntry<Toggle> recipeIsActive16 = config("VKE_VikingWolfHelmet", "IsRecipeEnabled", Toggle.On, "Enable recipe for Viking Wolf Helmet"); item64.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive16; MaterialReplacer.RegisterGameObjectForShaderSwap(item64.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item65 = new Item("medievaleras", "VKE_VikingWolfHelmetWhite"); item65.Name.English("White Viking Wolf Helmet"); item65.Name.Spanish("Casco Vikingo del Lobo Blanco"); item65.Description.English("A rare white wolf helmet symbolizing dominance and honor."); item65.Description.Spanish("Un raro casco de lobo blanco que simboliza dominio y honor."); item65.Crafting.Add(CraftingTable.Forge, 2); item65.RequiredItems.Add("Silver", 22); item65.RequiredItems.Add("WolfPelt", 6); item65.RequiredUpgradeItems.Add("Silver", 7); item65.CraftAmount = 1; SharedData shared16 = item65.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared; shared16.m_armor = 16f; shared16.m_armorPerLevel = 3f; shared16.m_weight = 3.6f; shared16.m_maxQuality = 4; shared16.m_maxDurability = 1200f; shared16.m_durabilityPerLevel = 220f; ConfigEntry<Toggle> recipeIsActive17 = config("VKE_VikingWolfHelmetWhite", "IsRecipeEnabled", Toggle.On, "Enable recipe for White Viking Wolf Helmet"); item65.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive17; MaterialReplacer.RegisterGameObjectForShaderSwap(item65.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); SetupWatcher(); } 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 { sunnfjordheimexpLogger.LogDebug((object)"ReadConfigValues called"); ((BaseUnityPlugin)this).Config.Reload(); } catch { sunnfjordheimexpLogger.LogError((object)("There was an issue loading your " + ConfigFileName)); sunnfjordheimexpLogger.LogError((object)"Please check your config entries for spelling and format!"); } } private ConfigEntry<T> config<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<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, val); SyncedConfigEntry<T> syncedConfigEntry = ConfigSync.AddConfigEntry<T>(val2); syncedConfigEntry.SynchronizedConfig = synchronizedSetting; return val2; } private ConfigEntry<T> config<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<object>()), synchronizedSetting); } static sunnfjordheimexpPlugin() { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName; ConnectionError = ""; sunnfjordheimexpLogger = Logger.CreateLogSource("sunnfjordheimexp"); ConfigSync = new ConfigSync("Zzyzxrd.sunnfjordheimexp") { DisplayName = "sunnfjordheimexp", CurrentVersion = "1.0.3", MinimumRequiredVersion = "1.0.3" }; _serverConfigLocked = null; _recipeIsActiveConfig = null; } } public static class KeyboardExtensions { public static bool IsKeyDown(this KeyboardShortcut shortcut) { //IL_0003: 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) return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKeyDown(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey); } public static bool IsKeyHeld(this KeyboardShortcut shortcut) { //IL_0003: 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) return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKey(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey); } } [HarmonyPatch(typeof(ZNet), "OnNewConnection")] public static class RegisterAndCheckVersion { private static void Prefix(ZNetPeer peer, ref ZNet __instance) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown sunnfjordheimexpPlugin.sunnfjordheimexpLogger.LogDebug((object)"Registering version RPC handler"); peer.m_rpc.Register<ZPackage>("sunnfjordheimexp_VersionCheck", (Action<ZRpc, ZPackage>)RpcHandlers.RPC_sunnfjordheimexp_Version); sunnfjordheimexpPlugin.sunnfjordheimexpLogger.LogInfo((object)"Invoking version check"); ZPackage val = new ZPackage(); val.Write("1.0.3"); peer.m_rpc.Invoke("sunnfjordheimexp_VersionCheck", new object[1] { val }); } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] public static class VerifyClient { private static bool Prefix(ZRpc rpc, ZPackage pkg, ref ZNet __instance) { if (!__instance.IsServer() || RpcHandlers.ValidatedPeers.Contains(rpc)) { return true; } sunnfjordheimexpPlugin.sunnfjordheimexpLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") never sent version or couldn't due to previous disconnect, disconnecting")); rpc.Invoke("Error", new object[1] { 3 }); return false; } private static void Postfix(ZNet __instance) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.instance.GetServerPeerID(), "sunnfjordheimexpRequestAdminSync", new object[1] { (object)new ZPackage() }); } } [HarmonyPatch(typeof(FejdStartup), "ShowConnectError")] public class ShowConnectionError { private static void Postfix(FejdStartup __instance) { if (__instance.m_connectionFailedPanel.activeSelf) { __instance.m_connectionFailedError.fontSizeMax = 25f; __instance.m_connectionFailedError.fontSizeMin = 15f; TMP_Text connectionFailedError = __instance.m_connectionFailedError; connectionFailedError.text = connectionFailedError.text + "\n" + sunnfjordheimexpPlugin.ConnectionError; } } } [HarmonyPatch(typeof(ZNet), "Disconnect")] public static class RemoveDisconnectedPeerFromVerified { private static void Prefix(ZNetPeer peer, ref ZNet __instance) { if (__instance.IsServer()) { sunnfjordheimexpPlugin.sunnfjordheimexpLogger.LogInfo((object)("Peer (" + peer.m_rpc.m_socket.GetHostName() + ") disconnected, removing from validated list")); RpcHandlers.ValidatedPeers.Remove(peer.m_rpc); } } } public static class RpcHandlers { public static readonly List<ZRpc> ValidatedPeers = new List<ZRpc>(); public static void RPC_sunnfjordheimexp_Version(ZRpc rpc, ZPackage pkg) { string text = pkg.ReadString(); sunnfjordheimexpPlugin.sunnfjordheimexpLogger.LogInfo((object)("Version check, local: 1.0.3, remote: " + text)); if (text != "1.0.3") { sunnfjordheimexpPlugin.ConnectionError = "sunnfjordheimexp Installed: 1.0.3\n Needed: " + text; if (ZNet.instance.IsServer()) { sunnfjordheimexpPlugin.sunnfjordheimexpLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") has incompatible version, disconnecting...")); rpc.Invoke("Error", new object[1] { 3 }); } } else if (!ZNet.instance.IsServer()) { sunnfjordheimexpPlugin.sunnfjordheimexpLogger.LogInfo((object)"Received same version from server!"); } else { sunnfjordheimexpPlugin.sunnfjordheimexpLogger.LogInfo((object)("Adding peer (" + rpc.m_socket.GetHostName() + ") to validated list")); ValidatedPeers.Add(rpc); } } public static string ComputeHashForMod() { using SHA256 sHA = SHA256.Create(); byte[] array = sHA.ComputeHash(File.ReadAllBytes(Assembly.GetExecutingAssembly().Location)); StringBuilder stringBuilder = new StringBuilder(); byte[] array2 = array; foreach (byte b in array2) { stringBuilder.Append(b.ToString("X2")); } return stringBuilder.ToString(); } } } namespace PieceManager { [PublicAPI] public static class MaterialReplacer { public enum ShaderType { PieceShader, VegetationShader, RockShader, RugShader, GrassShader, CustomCreature, UseUnityShader } private static readonly Dictionary<GameObject, bool> ObjectToSwap; private static readonly Dictionary<string, Material> OriginalMaterials; private static readonly Dictionary<GameObject, ShaderType> ObjectsForShaderReplace; private static readonly HashSet<Shader> 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<Shader>(); hasRun = false; OriginalMaterials = new Dictionary<string, Material>(); ObjectToSwap = new Dictionary<GameObject, bool>(); ObjectsForShaderReplace = new Dictionary<GameObject, ShaderType>(); 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<Material>(); 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<GameObject, bool> item in ObjectToSwap) { GameObject key = item.Key; bool value = item.Value; ProcessGameObjectMaterials(key, value); } AssetBundle[] array = Resources.FindObjectsOfTypeAll<AssetBundle>(); AssetBundle[] array2 = array; foreach (AssetBundle val in array2) { IEnumerable<Shader> enumerable3; try { IEnumerable<Shader> enumerable2; if (!val.isStreamedSceneAssetBundle || !Object.op_Implicit((Object)(object)val)) { IEnumerable<Shader> enumerable = val.LoadAllAssets<Shader>(); enumerable2 = enumerable; } else { enumerable2 = from shader in ((IEnumerable<string>)val.GetAllAssetNames()).Select((Func<string, Shader>)val.LoadAsset<Shader>) 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<GameObject, ShaderType> 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<Renderer>(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material[] sharedMaterials = val.sharedMaterials.Select((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 Material 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<Renderer>(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; } } } namespace LocalizationManager { [PublicAPI] public class Localizer { private static readonly Dictionary<string, Dictionary<string, Func<string>>> PlaceholderProcessors; private static readonly Dictionary<string, Dictionary<string, string>> loadedTexts; private static readonly ConditionalWeakTable<Localization, string> localizationLanguage; private static readonly List<WeakReference<Localization>> localizationObjects; private static BaseUnityPlugin? _plugin; private static readonly List<string> fileExtensions; private static BaseUnityPlugin plugin { get { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown if (_plugin == null) { IEnumerable<TypeInfo> source; try { source = Assembly.GetExecutingAssembly().DefinedTypes.ToList(); } catch (ReflectionTypeLoadException ex) { source = from t in ex.Types where t != null select t.GetTypeInfo(); } _plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First((TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } private static void UpdatePlaceholderText(Localization localization, string key) { localizationLanguage.TryGetValue(localization, out string value); string text = loadedTexts[value][key]; if (PlaceholderProcessors.TryGetValue(key, out Dictionary<string, Func<string>> value2)) { text = value2.Aggregate(text, (string current, KeyValuePair<string, Func<string>> kv) => current.Replace("{" + kv.Key + "}", kv.Value())); } localization.AddWord(key, text); } public static void AddPlaceholder<T>(string key, string placeholder, ConfigEntry<T> config, Func<T, string>? convertConfigValue = null) where T : notnull { string key2 = key; string placeholder2 = placeholder; Func<T, string> convertConfigValue2 = convertConfigValue; ConfigEntry<T> config2 = config; if (convertConfigValue2 == null) { convertConfigValue2 = (T val) => val.ToString(); } if (!PlaceholderProcessors.ContainsKey(key2)) { PlaceholderProcessors[key2] = new Dictionary<string, Func<string>>(); } config2.SettingChanged += delegate { UpdatePlaceholder(); }; if (loadedTexts.ContainsKey(Localization.instance.GetSelectedLanguage())) { UpdatePlaceholder(); } void UpdatePlaceholder() { PlaceholderProcessors[key2][placeholder2] = () => convertConfigValue2(config2.Value); UpdatePlaceholderText(Localization.instance, key2); } } public static void AddText(string key, string text) { List<WeakReference<Localization>> list = new List<WeakReference<Localization>>(); foreach (WeakReference<Localization> localizationObject in localizationObjects) { if (localizationObject.TryGetTarget(out var target)) { Dictionary<string, string> dictionary = loadedTexts[localizationLanguage.GetOrCreateValue(target)]; if (!target.m_translations.ContainsKey(key)) { dictionary[key] = text; target.AddWord(key, text); } } else { list.Add(localizationObject); } } foreach (WeakReference<Localization> item in list) { localizationObjects.Remove(item); } } public static void Load() { LoadLocalization(Localization.instance, Localization.instance.GetSelectedLanguage()); } private static void LoadLocalization(Localization __instance, string language) { if (!localizationLanguage.Remove(__instance)) { localizationObjects.Add(new WeakReference<Localization>(__instance)); } localizationLanguage.Add(__instance, language); Dictionary<string, string> dictionary = new Dictionary<string, string>(); foreach (string item in from f in Directory.GetFiles(Path.GetDirectoryName(Paths.PluginPath), plugin.Info.Metadata.Name + ".*", SearchOption.AllDirectories) where fileExtensions.IndexOf(Path.GetExtension(f)) >= 0 select f) { string text = Path.GetFileNameWithoutExtension(item).Split(new char[1] { '.' })[1]; if (dictionary.ContainsKey(text)) { Debug.LogWarning((object)("Duplicate key " + text + " found for " + plugin.Info.Metadata.Name + ". The duplicate file found at " + item + " will be skipped.")); } else { dictionary[text] = item; } } byte[] array = LoadTranslationFromAssembly("English"); if (array == null) { throw new Exception("Found no English localizations in mod " + plugin.Info.Metadata.Name + ". Expected an embedded resource translations/English.json or translations/English.yml."); } Dictionary<string, string> dictionary2 = new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(Encoding.UTF8.GetString(array)); if (dictionary2 == null) { throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Localization file was empty."); } string text2 = null; if (language != "English") { if (dictionary.ContainsKey(language)) { text2 = File.ReadAllText(dictionary[language]); } else { byte[] array2 = LoadTranslationFromAssembly(language); if (array2 != null) { text2 = Encoding.UTF8.GetString(array2); } } } if (text2 == null && dictionary.ContainsKey("English")) { text2 = File.ReadAllText(dictionary["English"]); } if (text2 != null) { foreach (KeyValuePair<string, string> item2 in new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(text2) ?? new Dictionary<string, string>()) { dictionary2[item2.Key] = item2.Value; } } loadedTexts[language] = dictionary2; foreach (KeyValuePair<string, string> item3 in dictionary2) { UpdatePlaceholderText(__instance, item3.Key); } } static Localizer() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown PlaceholderProcessors = new Dictionary<string, Dictionary<string, Func<string>>>(); loadedTexts = new Dictionary<string, Dictionary<string, string>>(); localizationLanguage = new ConditionalWeakTable<Localization, string>(); localizationObjects = new List<WeakReference<Localization>>(); fileExtensions = new List<string> { ".json", ".yml" }; Harmony val = new Harmony("org.bepinex.helpers.LocalizationManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalization", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } private static byte[]? LoadTranslationFromAssembly(string language) { foreach (string fileExtension in fileExtensions) { byte[] array = ReadEmbeddedFileBytes("translations." + language + fileExtension); if (array != null) { return array; } } return null; } public static byte[]? ReadEmbeddedFileBytes(string resourceFileName, Assembly? containingAssembly = null) { string resourceFileName2 = resourceFileName; using MemoryStream memoryStream = new MemoryStream(); if ((object)containingAssembly == null) { containingAssembly = Assembly.GetCallingAssembly(); } string text = containingAssembly.GetManifestResourceNames().FirstOrDefault((string str) => str.EndsWith(resourceFileName2, StringComparison.Ordinal)); if (text != null) { containingAssembly.GetManifestResourceStream(text)?.CopyTo(memoryStream); } return (memoryStream.Length == 0L) ? null : memoryStream.ToArray(); } } } namespace ItemManager { [PublicAPI] public 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] public enum ConversionPiece { Disabled, [InternalName("smelter")] Smelter, [InternalName("charcoal_kiln")] CharcoalKiln, [InternalName("blastfurnace")] BlastFurnace, [InternalName("windmill")] Windmill, [InternalName("piece_spinningwheel")] SpinningWheel, [InternalName("eitrrefinery")] EitrRefinery, Custom } public class InternalName : Attribute { public readonly string internalName; public InternalName(string internalName) { this.internalName = internalName; } } [PublicAPI] public class RequiredResourceList { public readonly List<Requirement> Requirements = new List<Requirement>(); public bool Free = false; 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<int> amountConfig, int quality = 0) { Requirements.Add(new Requirement { itemName = itemName, amountConfig = amountConfig, quality = quality }); } } [PublicAPI] public class CraftingStationList { public readonly List<CraftingStationConfig> Stations = new List<CraftingStationConfig>(); 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 }); } } [PublicAPI] public 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 = false; public float QualityResultAmountMultiplier = 1f; public ConfigEntryBase? RecipeIsActive = null; } [PublicAPI] public class Trade { public Trader Trader = Trader.None; public uint Price = 0u; public uint Stack = 1u; public string? RequiredGlobalKey = null; } [PublicAPI] [Flags] public enum Trader { None = 0, Haldor = 1, Hildir = 2 } public struct Requirement { public string itemName; public int amount; public ConfigEntry<int>? amountConfig; [Description("Set to a non-zero value to apply the requirement only for a specific quality")] public int quality; } public struct CraftingStationConfig { public CraftingTable Table; public int level; public string? custom; } [Flags] public enum Configurability { Disabled = 0, Recipe = 1, Stats = 2, Drop = 4, Trader = 8, Full = 0xF } [PublicAPI] public class DropTargets { public readonly List<DropTarget> Drops = new List<DropTarget>(); 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 }); } } public struct DropTarget { public string creature; public int min; public int max; public float chance; public bool levelMultiplier; } public enum Toggle { On = 1, Off = 0 } [PublicAPI] public class Item { private class ItemConfig { public ConfigEntry<string>? craft; public ConfigEntry<string>? upgrade; public ConfigEntry<CraftingTable> table = null; public ConfigEntry<int> tableLevel = null; public ConfigEntry<string> customTable = null; public ConfigEntry<int>? maximumTableLevel; public ConfigEntry<Toggle> requireOneIngredient = null; public ConfigEntry<float> qualityResultAmountMultiplier = null; } private class TraderConfig { public ConfigEntry<Trader> trader = null; public ConfigEntry<uint> price = null; public ConfigEntry<uint> stack = null; public ConfigEntry<string> requiredGlobalKey = null; } private class RequirementQuality { public int quality; } private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [UsedImplicitly] public string? Category; [UsedImplicitly] public Action<ConfigEntryBase>? CustomDrawer; public Func<bool>? browsability; } [PublicAPI] public enum DamageModifier { Normal, Resistant, Weak, Immune, Ignore, VeryResistant, VeryWeak, None } private delegate void setDmgFunc(ref DamageTypes dmg, float value); private class SerializedRequirements { public readonly List<Requirement> Reqs; public SerializedRequirements(List<Requirement> reqs) { Reqs = reqs; } public SerializedRequirements(string reqs) : this(reqs.Split(new char[1] { ',' }).Select(delegate(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((Requirement r) => $"{r.itemName}:{r.amount}" + ((r.quality > 0) ? $":{r.quality}" : ""))); } public static ItemDrop? fetchByName(ObjectDB objectDB, string name) { GameObject itemPrefab = objectDB.GetItemPrefab(name); ItemDrop val = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("The required item '" + name + "' does not exist.")); } return val; } public static Requirement[] toPieceReqs(ObjectDB objectDB, SerializedRequirements craft, SerializedRequirements upgrade) { //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_01b7: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Expected O, but got Unknown ObjectDB objectDB2 = objectDB; Dictionary<string, Requirement> dictionary = craft.Reqs.Where((Requirement r) => r.itemName != "").ToDictionary((Func<Requirement, string>)((Requirement r) => r.itemName), (Func<Requirement, Requirement>)delegate(Requirement r) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) ItemDrop val6 = ResItem(r); return (val6 == null) ? ((Requirement)null) : new Requirement { m_amount = (r.amountConfig?.Value ?? r.amount), m_resItem = val6, m_amountPerLevel = 0 }; }); List<Requirement> list = dictionary.Values.Where((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(); ItemDrop? ResItem(Requirement r) { return fetchByName(objectDB2, r.itemName); } } } private class SerializedDrop { public readonly List<DropTarget> Drops; public SerializedDrop(List<DropTarget> drops) { Drops = drops; } public SerializedDrop(string drops) { Drops = ((drops == "") ? ((IEnumerable<string>)Array.Empty<string>()) : ((IEnumerable<string>)drops.Split(new char[1] { ',' }))).Select(delegate(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((DropTarget r) => $"{r.creature}:{r.chance.ToString(CultureInfo.InvariantCulture)}:{r.min}:" + ((r.min == r.max) ? "" : $"{r.max}") + (r.levelMultiplier ? "" : ":0"))); } private static Character? fetchByName(ZNetScene netScene, string name) { GameObject prefab = netScene.GetPrefab(name); Character val = ((prefab != null) ? prefab.GetComponent<Character>() : null); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("The drop target character '" + name + "' does not exist.")); } return val; } public Dictionary<Character, Drop> toCharacterDrops(ZNetScene netScene, GameObject item) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown Dictionary<Character, Drop> dictionary = new Dictionary<Character, Drop>(); 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; public ItemDrop item; public Quaternion? itemRotation; } [CompilerGenerated] private sealed class <Transpile_InventoryGui>d__85 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IDisposable, IEnumerator { private int <>1__state; private CodeInstruction <>2__current; private int <>l__initialThreadId; private IEnumerable<CodeInstruction> instructions; public IEnumerable<CodeInstruction> <>3__instructions; private List<CodeInstruction> <instrs>5__1; private FieldInfo <amountField>5__2; private int <i>5__3; CodeInstruction IEnumerator<CodeInstruction>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <Transpile_InventoryGui>d__85(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { <instrs>5__1 = null; <amountField>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Expected O, but got Unknown //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Expected O, but got Unknown //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown int num; switch (<>1__state) { default: return false; case 0: <>1__state = -1; <instrs>5__1 = instructions.ToList(); <amountField>5__2 = AccessTools.DeclaredField(typeof(Recipe), "m_amount"); <i>5__3 = 0; break; case 1: <>1__state = -1; if (<i>5__3 > 1 && <instrs>5__1[<i>5__3 - 2].opcode == OpCodes.Ldfld && CodeInstructionExtensions.OperandIs(<instrs>5__1[<i>5__3 - 2], (MemberInfo)<amountField>5__2) && <instrs>5__1[<i>5__3 - 1].opcode == OpCodes.Ldc_I4_1 && <instrs>5__1[<i>5__3].operand is Label) { <>2__current = new CodeInstruction(OpCodes.Ldarg_0, (object)null); <>1__state = 2; return true; } goto IL_01ca; 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, <instrs>5__1[<i>5__3].operand); <>1__state = 4; return true; case 4: { <>1__state = -1; goto IL_01ca; } IL_01ca: num = <i>5__3 + 1; <i>5__3 = num; break; } if (<i>5__3 < <instrs>5__1.Count) { <>2__current = <instrs>5__1[<i>5__3]; <>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] IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator() { <Transpile_InventoryGui>d__85 <Transpile_InventoryGui>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <Transpile_InventoryGui>d__ = this; } else { <Transpile_InventoryGui>d__ = new <Transpile_InventoryGui>d__85(0); } <Transpile_InventoryGui>d__.instructions = <>3__instructions; return <Transpile_InventoryGui>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<CodeInstruction>)this).GetEnumerator(); } } private static readonly List<Item> registeredItems = new List<Item>(); private static readonly Dictionary<ItemDrop, Item> itemDropMap = new Dictionary<ItemDrop, Item>(); private static Dictionary<Item, Dictionary<string, List<Recipe>>> activeRecipes = new Dictionary<Item, Dictionary<string, List<Recipe>>>(); private