Decompiled source of sunnfjordheimexp v1.0.3

sunnfjordheimexp.dll

Decompiled 5 days ago
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