Decompiled source of WildWeapons v1.3.3

WildWeapons.dll

Decompiled 2 weeks 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 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("WildWeapons")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("WildWeapons")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")]
[assembly: AssemblyFileVersion("1.3.3")]
[assembly: AssemblyCompany("catharis")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.3.3.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[<4fb9555b-0c57-4f12-b0d9-dc429ee7cac6>Embedded]
	internal sealed class <4fb9555b-0c57-4f12-b0d9-dc429ee7cac6>EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[<4fb9555b-0c57-4f12-b0d9-dc429ee7cac6>Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	[CompilerGenerated]
	internal sealed class <53d0c374-467f-43b8-a0a7-0b3c397b54fd>NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public <53d0c374-467f-43b8-a0a7-0b3c397b54fd>NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public <53d0c374-467f-43b8-a0a7-0b3c397b54fd>NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[<4fb9555b-0c57-4f12-b0d9-dc429ee7cac6>Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class <4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public <4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace WildWeapons
{
	[BepInPlugin("catharis.WildWeapons", "WildWeapons", "1.3.3")]
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	public class WildWeaponsPlugin : BaseUnityPlugin
	{
		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)]
		public enum Toggle
		{
			On = 1,
			Off = 0
		}

		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)]
		private class ConfigurationManagerAttributes
		{
			[UsedImplicitly]
			public int? Order;

			[UsedImplicitly]
			public bool? Browsable;

			[UsedImplicitly]
			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
			public string Category;

			[UsedImplicitly]
			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 2, 1 })]
			public Action<ConfigEntryBase> CustomDrawer;
		}

		internal const string ModName = "WildWeapons";

		internal const string ModVersion = "1.3.3";

		internal const string Author = "catharis";

		private const string ModGUID = "catharis.WildWeapons";

		private static string ConfigFileName = "catharis.WildWeapons.cfg";

		private static string ConfigFileFullPath;

		internal static string ConnectionError;

		private readonly Harmony _harmony = new Harmony("catharis.WildWeapons");

		public static readonly ManualLogSource WildWeaponsLogger;

		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("wildweapons", "DemonBlade1_CAH");
			item.Name.English("Aehm");
			item.Description.English("Demonic sword Aehm, Brother sword of Vehm.");
			item.Name.Chinese("魔剑·艾姆");
			item.Description.Chinese("恶魔双剑艾姆,维姆的兄弟剑。");
			item.Name.French("Aehm");
			item.Description.French("Épée démoniaque Aehm, épée frère de Vehm.");
			item.Name.Russian("Меч Демона");
			item.Description.Russian("демонический меч ахм, брат сестры-меча вем.");
			item.Crafting.Add(CraftingTable.BlackForge, 1);
			item.RequiredItems.Add("SwordBlackmetal", 1);
			item.RequiredItems.Add("YagluthDrop", 1);
			item.RequiredItems.Add("Bloodbag", 10);
			item.RequiredUpgradeItems.Add("BlackMetal", 5);
			item.RequiredUpgradeItems.Add("Bloodbag", 5);
			item.CraftAmount = 1;
			item.Trade.Price = 0u;
			item.Trade.Stack = 0u;
			item.Trade.RequiredGlobalKey = "defeated_bonemass";
			item.Trade.Trader = Trader.None;
			Item item2 = new Item("wildweapons", "DemonBlade2_CAH");
			item2.Name.English("Vehm");
			item2.Description.English("Demonic sword Vehm, Sister sword of Aehm.");
			item2.Name.Chinese("魔剑·维姆");
			item2.Description.Chinese("恶魔双剑维姆,艾姆的姐妹剑。");
			item2.Name.French("Vehm");
			item2.Description.French("Épée démoniaque Vehm, épée sœur d'Aehm.");
			item2.Name.Russian("Меч Демона 2");
			item2.Description.Russian("Демонический меч Вем, сестра брата меча Ахема");
			item2.Crafting.Add(CraftingTable.BlackForge, 4);
			item2.RequiredItems.Add("SwordBlackmetal", 1);
			item2.RequiredItems.Add("YagluthDrop", 1);
			item2.RequiredItems.Add("Bloodbag", 10);
			item2.RequiredUpgradeItems.Add("BlackMetal", 5);
			item2.RequiredUpgradeItems.Add("Bloodbag", 5);
			item2.CraftAmount = 1;
			item2.Trade.Price = 0u;
			item2.Trade.Stack = 0u;
			item2.Trade.RequiredGlobalKey = "defeated_bonemass";
			item2.Trade.Trader = Trader.None;
			Item item3 = new Item("wildweapons", "Infernus_CAH");
			item3.Name.English("Infernus");
			item3.Description.English("A burning blade once wielded by a great queen who built a castle atop a volcano, eventually people tired of her control and slaughtered her.");
			item3.Name.French("Infernus");
			item3.Description.French("Une lame brûlante autrefois brandie par une grande reine qui a construit un château au sommet d'un volcan, le peuple s'est finalement lassé de son contrôle et l'a massacrée.");
			item3.Name.Russian("Инфернус");
			item3.Description.Russian("Клинок Пламенной Королевы");
			item3.Name.Chinese("火山巨剑");
			item3.Description.Chinese("曾属于火山女王的烈焰之剑,因暴政她被臣民诛杀");
			item3.Crafting.Add(CraftingTable.BlackForge, 4);
			item3.RequiredItems.Add("MoltenCore", 5);
			item3.RequiredItems.Add("Charredskull", 10);
			item3.RequiredItems.Add("FlametalNew", 10);
			item3.RequiredUpgradeItems.Add("Charredskull", 1);
			item3.RequiredUpgradeItems.Add("FlametalNew", 5);
			item3.CraftAmount = 1;
			item3.Trade.Price = 0u;
			item3.Trade.Stack = 0u;
			item3.Trade.RequiredGlobalKey = "defeated_bonemass";
			item3.Trade.Trader = Trader.None;
			Item item4 = new Item("wildweapons", "Corundum_CAH");
			item4.Name.English("Corundum");
			item4.Description.English("The mightiest hammer there is, capable of crushing any rock, or skull...");
			item4.Name.Chinese("碎刚重锤");
			item4.Description.Chinese("能粉碎岩石与颅骨的绝世战锤。");
			item4.Name.French("Corindon");
			item4.Description.French("Le marteau le plus puissant qui existe, capable d'écraser n'importe quelle roche ou crâne...");
			item4.Name.Russian("Корунд");
			item4.Description.Russian("Самый мощный молот, способный раздробить любой камень или череп...");
			item4.Crafting.Add(CraftingTable.BlackForge, 4);
			item4.RequiredItems.Add("TrophyFader", 1);
			item4.RequiredItems.Add("GemstoneRed", 1);
			item4.RequiredItems.Add("FlametalNew", 30);
			item4.RequiredItems.Add("MoltenCore", 5);
			item4.RequiredUpgradeItems.Add("MoltenCore", 1);
			item4.RequiredUpgradeItems.Add("FlametalNew", 5);
			item4.CraftAmount = 1;
			item4.Trade.Price = 0u;
			item4.Trade.Stack = 0u;
			item4.Trade.RequiredGlobalKey = "defeated_bonemass";
			item4.Trade.Trader = Trader.None;
			Item item5 = new Item("wildweapons", "Corruptum_CAH");
			item5.Name.English("Corruptum");
			item5.Description.English("A cursed axe that eats away at the minds and bodies of foes, granting vigor to its wielder.");
			item5.Name.Chinese("噬魂战斧");
			item5.Description.Chinese("吞噬敌人身心滋养持斧者的诅咒之斧。");
			item5.Name.French("Corruptum");
			item5.Description.French("Une hache maudite qui ronge l'esprit et le corps des ennemis, accordant de la vigueur à son porteur.");
			item5.Name.Russian("Корраптум");
			item5.Description.Russian("Проклятый топор, разъедающий разум и тело врагов, даруя силу своему владельцу.");
			item5.Crafting.Add(CraftingTable.Forge, 5);
			item5.RequiredItems.Add("TrophyGoblinBruteBrosShaman", 1);
			item5.RequiredItems.Add("TrophyGoblin", 5);
			item5.RequiredItems.Add("Guck", 20);
			item5.RequiredUpgradeItems.Add("TrophyGoblin", 1);
			item5.RequiredUpgradeItems.Add("Guck", 5);
			item5.CraftAmount = 1;
			item5.Trade.Price = 0u;
			item5.Trade.Stack = 0u;
			item5.Trade.RequiredGlobalKey = "defeated_bonemass";
			item5.Trade.Trader = Trader.None;
			Item item6 = new Item("wildweapons", "DemonVane_CAH");
			item6.Name.English("Demonvane");
			item6.Description.English("An insidious spear that gives off a woeful aura...");
			item6.Name.Chinese("悲鸣魔枪");
			item6.Description.Chinese("散发哀伤气息的阴险长枪...");
			item6.Name.French("Lance Démoniaque");
			item6.Description.French("Une lance insidieuse qui dégage une aura pitoyable...");
			item6.Name.Russian("Демонвейн");
			item6.Description.Russian("Коварное копье, излучающее печаль...");
			item6.Crafting.Add(CraftingTable.BlackForge, 3);
			item6.RequiredItems.Add("BlackMetal", 15);
			item6.RequiredItems.Add("BlackCore", 5);
			item6.RequiredItems.Add("TrophyDvergr", 1);
			item6.RequiredUpgradeItems.Add("BlackMetal", 5);
			item6.RequiredUpgradeItems.Add("BlackCore", 1);
			item6.CraftAmount = 1;
			item6.Trade.Price = 0u;
			item6.Trade.Stack = 0u;
			item6.Trade.RequiredGlobalKey = "defeated_bonemass";
			item6.Trade.Trader = Trader.None;
			Item item7 = new Item("wildweapons", "MountainCleaver_CAH");
			item7.Name.English("Mountain Cleaver");
			item7.Description.English("A massive heavy blade capable of tearing even mountains asunder.");
			item7.Name.Chinese("断岳巨刃");
			item7.Description.Chinese("足以劈开山峦的巨型重剑。");
			item7.Name.French("Couperet de Montagne");
			item7.Description.French("Une lame massive et lourde capable de déchirer même les montagnes.");
			item7.Name.Russian("Рассекатель Гор");
			item7.Description.Russian("Массивный, тяжелый клинок, способный разорвать даже горы.");
			item7.Crafting.Add(CraftingTable.Forge, 5);
			item7.RequiredItems.Add("Iron", 80);
			item7.RequiredItems.Add("Silver", 30);
			item7.RequiredItems.Add("TrophySGolem", 1);
			item7.RequiredUpgradeItems.Add("Iron", 5);
			item7.RequiredUpgradeItems.Add("Silver", 5);
			item7.CraftAmount = 1;
			item7.Trade.Price = 0u;
			item7.Trade.Stack = 0u;
			item7.Trade.RequiredGlobalKey = "defeated_bonemass";
			item7.Trade.Trader = Trader.None;
			Item item8 = new Item("wildweapons", "Regalia_CAH");
			item8.Name.English("Regalia");
			item8.Description.English("A regal and deadly dagger that was once used to kill a great king.");
			item8.Name.Chinese("弑君匕首");
			item8.Description.Chinese("曾终结国王性命的华贵凶器。");
			item8.Name.French("Regalia");
			item8.Description.French("Un poignard royal et mortel qui fut autrefois utilisé pour tuer un grand roi.");
			item8.Name.Russian("Регалия");
			item8.Description.Russian("Королевский и смертоносный кинжал, который когда-то убил великого короля.");
			item8.Crafting.Add(CraftingTable.BlackForge, 4);
			item8.RequiredItems.Add("GemstoneBlue", 5);
			item8.RequiredItems.Add("TrophyFader", 1);
			item8.RequiredItems.Add("Bronze", 15);
			item8.RequiredItems.Add("Silver", 15);
			item8.RequiredUpgradeItems.Add("Bronze", 5);
			item8.RequiredUpgradeItems.Add("Silver", 5);
			item8.CraftAmount = 1;
			item8.Trade.Price = 0u;
			item8.Trade.Stack = 0u;
			item8.Trade.RequiredGlobalKey = "defeated_bonemass";
			item8.Trade.Trader = Trader.None;
			Item item9 = new Item("wildweapons", "BoneReaver_CAH");
			item9.Name.English("Bonereaver");
			item9.Description.English("An incredibly violent blade made to rip apart foes. Something about violating a geneva convention, whatever that is.");
			item9.Name.Chinese("碎骨刃");
			item9.Description.Chinese("为撕裂敌人打造的凶暴兵刃,隐约违反过某公约。");
			item9.Name.French("Brise-os");
			item9.Description.French("Une lame incroyablement violente, conçue pour déchirer les ennemis. Une sorte de violation d'une Convention de Genève, quelle qu'elle soit.");
			item9.Name.Russian("Потрошитель Костей");
			item9.Description.Russian("Применение этого оружия является военным преступлением и нарушает Женевскую конвенцию.");
			item9.Crafting.Add(CraftingTable.BlackForge, 1);
			item9.RequiredItems.Add("TrophyGoblinKing", 1);
			item9.RequiredItems.Add("BoneFragments", 50);
			item9.RequiredItems.Add("Bloodbag", 25);
			item9.RequiredUpgradeItems.Add("BoneFragments", 10);
			item9.RequiredUpgradeItems.Add("Bloodbag", 10);
			item9.CraftAmount = 1;
			item9.Trade.Price = 0u;
			item9.Trade.Stack = 0u;
			item9.Trade.RequiredGlobalKey = "defeated_bonemass";
			item9.Trade.Trader = Trader.None;
			Item item10 = new Item("wildweapons", "Astralis_CAH");
			item10.Name.English("Astralis");
			item10.Description.English("A magical blade forged from crystals produced by the dragon queen herself.");
			item10.Name.Chinese("龙晶剑");
			item10.Description.Chinese("用龙晶锻造的魔法剑。");
			item10.Name.French("Astralis");
			item10.Description.French("Une lame magique forgée à partir de cristaux produits par la Reine Dragon elle-même.");
			item10.Name.Russian("Астралис");
			item10.Description.Russian("Волшебный клинок, выкованный из кристаллов, созданных самой Королевой Драконов.");
			item10.Crafting.Add(CraftingTable.Forge, 5);
			item10.RequiredItems.Add("Silver", 15);
			item10.RequiredItems.Add("FreezeGland", 15);
			item10.RequiredItems.Add("TrophySGolem", 1);
			item10.RequiredUpgradeItems.Add("FreezeGland", 5);
			item10.RequiredUpgradeItems.Add("Silver", 5);
			item10.CraftAmount = 1;
			item10.Trade.Price = 0u;
			item10.Trade.Stack = 0u;
			item10.Trade.RequiredGlobalKey = "defeated_bonemass";
			item10.Trade.Trader = Trader.None;
			Item item11 = new Item("wildweapons", "FlowerVeil_CAH");
			item11.Name.English("Flowerveil");
			item11.Description.English("This ornate sword seems to have come from a far off land, it feels as though the wind runs through you when held.");
			item11.Name.Chinese("飞花刃");
			item11.Description.Chinese("持剑时如沐清风的异国华剑。");
			item11.Name.French("Voile de Fleurs");
			item11.Description.French("Cette épée ornée semble venir d'un pays lointain, on a l'impression que le vent souffle à travers vous lorsque vous la tenez.");
			item11.Name.Russian("Цветочная Вуаль");
			item11.Description.Russian("Этот богато украшенный меч словно прилетел из далекой страны: когда держишь его в руках, создается ощущение, будто сквозь тебя дует ветер.");
			item11.Crafting.Add(CraftingTable.BlackForge, 1);
			item11.RequiredItems.Add("Silver", 15);
			item11.RequiredItems.Add("Wisp", 5);
			item11.RequiredItems.Add("PowderedDragonEgg", 10);
			item11.RequiredUpgradeItems.Add("Silver", 5);
			item11.RequiredUpgradeItems.Add("PowderedDragonEgg", 2);
			item11.CraftAmount = 1;
			item11.Trade.Price = 0u;
			item11.Trade.Stack = 0u;
			item11.Trade.RequiredGlobalKey = "defeated_bonemass";
			item11.Trade.Trader = Trader.None;
			Item item12 = new Item("wildweapons", "DeusInterfectorem_CAH");
			item12.Name.English("Deus Interfectorem");
			item12.Description.English("Forged by a god to kill a god, you have no place even holding it.");
			item12.Name.Chinese("弑神者");
			item12.Description.Chinese("凡人根本不配持有的弑神兵器。");
			item12.Name.French("Tueur de Dieu");
			item12.Description.French("Forgé par un dieu pour tuer un dieu, vous n'avez même pas le droit de le tenir.");
			item12.Name.Russian("Убийца Богов");
			item12.Description.Russian("Выкованный богом, чтобы убить бога, у вас даже нет места для его хранения.");
			item12.Crafting.Add(CraftingTable.BlackForge, 4);
			item12.RequiredItems.Add("FlametalNew", 30);
			item12.RequiredItems.Add("ShieldCore", 1);
			item12.RequiredItems.Add("GemstoneRed", 1);
			item12.RequiredItems.Add("TrophyFader", 1);
			item12.RequiredUpgradeItems.Add("FlametalNew", 10);
			item12.RequiredUpgradeItems.Add("GemstoneRed", 1);
			item12.CraftAmount = 1;
			item12.Trade.Price = 0u;
			item12.Trade.Stack = 0u;
			item12.Trade.RequiredGlobalKey = "defeated_bonemass";
			item12.Trade.Trader = Trader.None;
			Item item13 = new Item("wildweapons", "FearNaught_CAH");
			item13.Name.English("Fearnaught");
			item13.Description.English("A vile scythe that has reaped the lives of many, will you use it? or will it use you?");
			item13.Name.Chinese("无惧之镰");
			item13.Description.Chinese("收割无数生命的妖镰,当心被它反噬。");
			item13.Name.French("Fearnaught");
			item13.Description.French("Une faux immonde qui a coûté la vie à tant de personnes, l'utiliserez-vous ? Ou est-ce elle qui vous utilisera?");
			item13.Name.Russian("Бесстрашный");
			item13.Description.Russian("Используешь ли ты эту мерзкую косу, отнявшую жизни многих? Или она использует тебя?");
			item13.Crafting.Add(CraftingTable.Forge, 5);
			item13.RequiredItems.Add("TrophyGoblinShaman", 1);
			item13.RequiredItems.Add("BlackMetal", 20);
			item13.RequiredItems.Add("AtgeirBlackmetal", 5);
			item13.RequiredUpgradeItems.Add("BlackMetal", 5);
			item13.RequiredUpgradeItems.Add("TrophyGoblinShaman", 1);
			item13.CraftAmount = 1;
			item13.Trade.Price = 0u;
			item13.Trade.Stack = 0u;
			item13.Trade.RequiredGlobalKey = "defeated_bonemass";
			item13.Trade.Trader = Trader.None;
			Item item14 = new Item("wildweapons", "SoulThief_CAH");
			item14.Name.English("Soulthief");
			item14.Description.English("A sinister and ominous Odachi, it seems to require something other than physical might to wield...");
			item14.Name.Chinese("窃魂太刀");
			item14.Description.Chinese("需特殊条件驾驭的阴森长刀...");
			item14.Name.French("Voleur d'âme");
			item14.Description.French("Un Odachi sinistre et inquiétant, il semble nécessiter plus que de la force physique pour le manier...");
			item14.Name.Russian("Похититель Душ");
			item14.Description.Russian("Зловещий и зловещий Одати, для владения которым, похоже, требуется нечто большее, чем физическая сила...");
			item14.Crafting.Add(CraftingTable.MageTable, 1);
			item14.RequiredItems.Add("Eitr", 20);
			item14.RequiredItems.Add("BlackCore", 5);
			item14.RequiredItems.Add("BlackMetal", 15);
			item14.RequiredUpgradeItems.Add("Eitr", 5);
			item14.RequiredUpgradeItems.Add("BlackMetal", 5);
			item14.CraftAmount = 1;
			item14.Trade.Price = 0u;
			item14.Trade.Stack = 0u;
			item14.Trade.RequiredGlobalKey = "defeated_bonemass";
			item14.Trade.Trader = Trader.None;
			Item item15 = new Item("wildweapons", "Esterra_CAH");
			item15.Name.English("Esterra");
			item15.Description.English("Holy Blade Esterra, once wielded by a self proclaimed hero, that hero was unskilled, and died a nameless death.");
			item15.Name.Chinese("圣剑埃斯特拉");
			item15.Description.Chinese("无名英雄的佩剑,因主人无能而蒙尘。");
			item15.Name.French("Esterra");
			item15.Description.French("Lame sacrée d'Esterra, autrefois maniée par un héros autoproclamé, ce héros n'était pas qualifié et est mort d'une mort indescriptible.");
			item15.Name.Russian("Эстерра");
			item15.Description.Russian("Священный Клинок Эстер, некогда принадлежавший самопровозглашенному герою, оказался бесполезным и погиб безымянной смертью.");
			item15.Crafting.Add(CraftingTable.BlackForge, 1);
			item15.RequiredItems.Add("Silver", 25);
			item15.RequiredItems.Add("TrophySeekerBrute", 1);
			item15.RequiredItems.Add("TrophyGjall", 1);
			item15.RequiredItems.Add("Eitr", 10);
			item15.RequiredUpgradeItems.Add("Silver", 5);
			item15.RequiredUpgradeItems.Add("Eitr", 5);
			item15.CraftAmount = 1;
			item15.Trade.Price = 0u;
			item15.Trade.Stack = 0u;
			item15.Trade.RequiredGlobalKey = "defeated_bonemass";
			item15.Trade.Trader = Trader.None;
			Item item16 = new Item("wildweapons", "CrownofIce_CAH");
			item16.Name.English("Crown of Ice");
			item16.Description.English("A great axe once wielded by a now dead king who ruled a castle in the deep north.");
			item16.Name.Chinese("冰霜王斧");
			item16.Description.Chinese("北境冰堡已故国王的巨斧。");
			item16.Name.French("Couronne de glace");
			item16.Description.French("Une grande hache autrefois brandie par un roi aujourd'hui décédé qui dirigeait un château dans l'extrême nord.");
			item16.Name.Russian("Ледяная Корона");
			item16.Description.Russian("Огромный топор, которым когда-то владел ныне покойный король, правивший замком на далеком севере.");
			item16.Crafting.Add(CraftingTable.Forge, 5);
			item16.RequiredItems.Add("TrophyCultist_Hildir", 1);
			item16.RequiredItems.Add("FreezeGland", 20);
			item16.RequiredItems.Add("Silver", 25);
			item16.RequiredUpgradeItems.Add("Silver", 5);
			item16.RequiredUpgradeItems.Add("FreezeGland", 5);
			item16.CraftAmount = 1;
			item16.Trade.Price = 0u;
			item16.Trade.Stack = 0u;
			item16.Trade.RequiredGlobalKey = "defeated_bonemass";
			item16.Trade.Trader = Trader.None;
			Item item17 = new Item("wildweapons", "TitanFeller_CAH");
			item17.Name.English("Titansbane");
			item17.Description.English("A gigantic axe that was used by warriors of old to cut down the Jotunn in the north.");
			item17.Name.Chinese("戮神斧");
			item17.Description.Chinese("远古战士用以斩杀巨人的神兵。");
			item17.Name.French("Tueur de Titans");
			item17.Description.French("Une hache gigantesque utilisée par les guerriers d'autrefois pour tuer les Jotunn dans le nord.");
			item17.Name.Russian("Сокрушитель Титанов");
			item17.Description.Russian("Гигантский топор, который использовали древние воины для уничтожения ётунов на севере.");
			item17.Crafting.Add(CraftingTable.Forge, 5);
			item17.RequiredItems.Add("LinenThread", 20);
			item17.RequiredItems.Add("TrophyGoblinBruteBrosBrute", 1);
			item17.RequiredItems.Add("Iron", 40);
			item17.RequiredUpgradeItems.Add("LinenThread", 5);
			item17.RequiredUpgradeItems.Add("Iron", 5);
			item17.CraftAmount = 1;
			item17.Trade.Price = 0u;
			item17.Trade.Stack = 0u;
			item17.Trade.RequiredGlobalKey = "defeated_bonemass";
			item17.Trade.Trader = Trader.None;
			Item item18 = new Item("wildweapons", "JadeJian_CAH");
			item18.Name.English("Tian Du");
			item18.Description.English("The ancient jian once wielded by the one known as the Heavenly Poison Demon.");
			item18.Name.Chinese("天毒剑");
			item18.Description.Chinese("「天毒老怪」曾用的翡翠古剑。");
			item18.Name.French("Tian Du");
			item18.Description.French("L'ancien jian autrefois utilisé par celui connu sous le nom de Démon du Poison Céleste.");
			item18.Name.Russian("Тянь Ду");
			item18.Description.Russian("Древний цзянь, которым когда-то владел демон, известный как Небесный Ядовитый Демон.");
			item18.Crafting.Add(CraftingTable.BlackForge, 3);
			item18.RequiredItems.Add("TrophyTick", 5);
			item18.RequiredItems.Add("Eitr", 30);
			item18.RequiredItems.Add("Sap", 30);
			item18.RequiredUpgradeItems.Add("Eitr", 5);
			item18.RequiredUpgradeItems.Add("Sap", 5);
			item18.CraftAmount = 1;
			item18.Trade.Price = 0u;
			item18.Trade.Stack = 0u;
			item18.Trade.RequiredGlobalKey = "defeated_bonemass";
			item18.Trade.Trader = Trader.None;
			Item item19 = new Item("wildweapons", "Lavruna_CAH");
			item19.Name.English("Lavruna");
			item19.Description.English("An ornate axe used by the foot soldiers of a secret sect of mountain rogues.");
			item19.Name.Chinese("山秘战斧");
			item19.Description.Chinese("山中密教武士的雕花战斧。");
			item19.Name.French("Lavruna");
			item19.Description.French("Une hache ornée utilisée par les fantassins d'une secte secrète de voleurs de montagne.");
			item19.Name.Russian("Лавруна");
			item19.Description.Russian("Изысканный топор, используемый пехотинцами тайной секты горных разбойников.");
			item19.Crafting.Add(CraftingTable.Forge, 5);
			item19.RequiredItems.Add("LinenThread", 20);
			item19.RequiredItems.Add("Bronze", 20);
			item19.RequiredItems.Add("Tar", 10);
			item19.RequiredUpgradeItems.Add("LinenThread", 5);
			item19.RequiredUpgradeItems.Add("Tar", 5);
			item19.CraftAmount = 1;
			item19.Trade.Price = 0u;
			item19.Trade.Stack = 0u;
			item19.Trade.RequiredGlobalKey = "defeated_bonemass";
			item19.Trade.Trader = Trader.None;
			Item item20 = new Item("wildweapons", "DevilThorn_CAH");
			item20.Name.English("Devil's Thorn");
			item20.Description.English("A magic-forged dagger said to be capable of cutting through even iron.");
			item20.Name.Chinese("破魔刺");
			item20.Description.Chinese("传说能刺穿钢铁的魔法匕首。");
			item20.Name.French("Épine du diable");
			item20.Description.French("Un poignard forgé par magie, censé pouvoir couper même le fer.");
			item20.Name.Russian("Шип Дьявола");
			item20.Description.Russian("Выкованный с помощью магии кинжал, который, как говорят, способен разрезать даже железо.");
			item20.Crafting.Add(CraftingTable.BlackForge, 1);
			item20.RequiredItems.Add("Silver", 10);
			item20.RequiredItems.Add("GiantBloodSack", 10);
			item20.RequiredItems.Add("YagluthDrop", 1);
			item20.RequiredUpgradeItems.Add("Silver", 5);
			item20.RequiredUpgradeItems.Add("GiantBloodSack", 5);
			item20.CraftAmount = 1;
			item20.Trade.Price = 0u;
			item20.Trade.Stack = 0u;
			item20.Trade.RequiredGlobalKey = "defeated_bonemass";
			item20.Trade.Trader = Trader.None;
			Item item21 = new Item("wildweapons", "RoyalShield_CAH");
			item21.Name.English("Royal Shield");
			item21.Description.English("A shield used by the Avereign royal guard before the kingdom's fall.");
			item21.Name.Chinese("王陨之盾");
			item21.Description.Chinese("王国覆灭前的王室卫队盾。");
			item21.Name.French("Bouclier Royale");
			item21.Description.French("Un bouclier utilisé par la Garde Royale Avereign avant la chute du royaume.");
			item21.Name.Russian("Королевский Щи");
			item21.Description.Russian("Щит, использовавшийся королевской гвардией Аверейна до падения королевства.");
			item21.Crafting.Add(CraftingTable.Forge, 3);
			item21.RequiredItems.Add("Ruby", 15);
			item21.RequiredItems.Add("Bronze", 30);
			item21.RequiredItems.Add("SerpentScale", 15);
			item21.RequiredUpgradeItems.Add("Ruby", 1);
			item21.RequiredUpgradeItems.Add("SerpentScale", 2);
			item21.CraftAmount = 1;
			item21.Trade.Price = 0u;
			item21.Trade.Stack = 0u;
			item21.Trade.RequiredGlobalKey = "defeated_bonemass";
			item21.Trade.Trader = Trader.None;
			Item item22 = new Item("wildweapons", "RoyalLance_CAH");
			item22.Name.English("Royal Lance");
			item22.Description.English("A lance used by the Avereign Royal guard before the kingdom's fall.");
			item22.Name.Chinese("末裔骑枪");
			item22.Description.Chinese("王国覆灭前的王室卫队长枪。");
			item22.Name.French("Lance royale");
			item22.Description.French("Une lance utilisée par la garde royale avant la chute du royaume");
			item22.Name.Russian("Королевское Копье");
			item22.Description.Russian("Копье, использовавшееся королевской гвардией Аверейна до падения королевства.");
			item22.Crafting.Add(CraftingTable.Forge, 3);
			item22.RequiredItems.Add("Ruby", 15);
			item22.RequiredItems.Add("Bronze", 30);
			item22.RequiredItems.Add("TrophySerpent", 1);
			item22.RequiredUpgradeItems.Add("Bronze", 5);
			item22.RequiredUpgradeItems.Add("Ruby", 1);
			item22.CraftAmount = 1;
			item22.Trade.Price = 0u;
			item22.Trade.Stack = 0u;
			item22.Trade.RequiredGlobalKey = "defeated_bonemass";
			item22.Trade.Trader = Trader.None;
			Item item23 = new Item("wildweapons", "RoyalBow_CAH");
			item23.Name.English("Royal Bow");
			item23.Description.English("A bow used by the Avereign Royal archers before the kingdom's fall.");
			item23.Name.Chinese("战弓·卫国");
			item23.Description.Chinese("王国陨落前御用弓骑手的制式武装");
			item23.Name.French("");
			item23.Description.French("");
			item23.Name.Russian("");
			item23.Description.Russian("");
			item23.Crafting.Add(CraftingTable.Forge, 3);
			item23.RequiredItems.Add("Ruby", 15);
			item23.RequiredItems.Add("Bronze", 30);
			item23.RequiredItems.Add("SerpentScale", 5);
			item23.RequiredUpgradeItems.Add("Bronze", 5);
			item23.RequiredUpgradeItems.Add("Ruby", 1);
			item23.CraftAmount = 1;
			item23.Trade.Price = 0u;
			item23.Trade.Stack = 0u;
			item23.Trade.RequiredGlobalKey = "defeated_bonemass";
			item23.Trade.Trader = Trader.None;
			Item item24 = new Item("wildweapons", "Malevolence_CAH");
			item24.Name.English("Malevolence");
			item24.Description.English("The great spear once wielded by the most feared necromancer in the land.");
			item24.Name.Chinese("死灵王枪");
			item24.Description.Chinese("最令人恐惧的死灵法师之枪。");
			item24.Name.French("Malevolence");
			item24.Description.French("La grande lance autrefois brandie par le nécromancien le plus redouté du pays.");
			item24.Name.Russian("Злоба");
			item24.Description.Russian("Огромное копье, которым когда-то владел самый грозный некромант в стране.");
			item24.Crafting.Add(CraftingTable.BlackForge, 4);
			item24.RequiredItems.Add("GemstoneGreen", 5);
			item24.RequiredItems.Add("TrophyFader", 1);
			item24.RequiredItems.Add("Chitin", 20);
			item24.RequiredItems.Add("BonemawSerpentTooth", 10);
			item24.RequiredUpgradeItems.Add("Chitin", 5);
			item24.RequiredUpgradeItems.Add("BonemawSerpentTooth", 5);
			item24.CraftAmount = 1;
			item24.Trade.Price = 0u;
			item24.Trade.Stack = 0u;
			item24.Trade.RequiredGlobalKey = "defeated_bonemass";
			item24.Trade.Trader = Trader.None;
			Item item25 = new Item("wildweapons", "Arondight_CAH");
			item25.Name.English("Arondight");
			item25.Description.English("A legendary sword, reborn and stronger than ever.");
			item25.Name.Chinese("重辉圣剑");
			item25.Description.Chinese("以更强姿态重现人间的传说圣剑。");
			item25.Name.French("Arondight");
			item25.Description.French("Une épée légendaire, renaissante et plus forte que jamais.");
			item25.Name.Russian("Арондит");
			item25.Description.Russian("Легендарный меч, возрожденный и более сильный, чем когда-либо.");
			item25.Crafting.Add(CraftingTable.BlackForge, 1);
			item25.RequiredItems.Add("Coins", 1000);
			item25.RequiredItems.Add("THSwordKrom", 1);
			item25.RequiredItems.Add("TrophySeekerQueen", 1);
			item25.RequiredItems.Add("TrophyDragonQueen", 1);
			item25.RequiredUpgradeItems.Add("DragonTear", 5);
			item25.RequiredUpgradeItems.Add("QueenDrop", 1);
			item25.CraftAmount = 1;
			item25.Trade.Price = 0u;
			item25.Trade.Stack = 0u;
			item25.Trade.RequiredGlobalKey = "defeated_bonemass";
			item25.Trade.Trader = Trader.None;
			Item item26 = new Item("wildweapons", "Avrinn_CAH");
			item26.Name.English("Avrinn");
			item26.Description.English("???");
			item26.Name.Chinese("无名之刃");
			item26.Description.Chinese("???");
			item26.Name.French("Avrinn");
			item26.Description.French("???");
			item26.Name.Russian("Авринн");
			item26.Description.Russian("???");
			item26.Crafting.Add(CraftingTable.Disabled, 1);
			item26.RequiredItems.Add("GemstoneRed", 5);
			item26.RequiredItems.Add("TrophyFader", 1);
			item26.RequiredItems.Add("Silver", 50);
			item26.RequiredItems.Add("SwordDyrnwyn", 1);
			item26.RequiredUpgradeItems.Add("Silver", 5);
			item26.RequiredUpgradeItems.Add("QueenDrop", 1);
			item26.CraftAmount = 1;
			item26.Trade.Price = 0u;
			item26.Trade.Stack = 0u;
			item26.Trade.RequiredGlobalKey = "defeated_bonemass";
			item26.Trade.Trader = Trader.None;
			Item item27 = new Item("wildweapons", "Agareth_CAH");
			item27.Name.English("Agareth");
			item27.Description.English("???");
			item27.Name.Chinese("阿加雷斯");
			item27.Description.Chinese("???");
			item27.Name.French("Agareth");
			item27.Description.French("???");
			item27.Name.Russian("Агарет");
			item27.Description.Russian("???");
			item27.Crafting.Add(CraftingTable.Disabled, 1);
			item27.RequiredItems.Add("TrophyFader", 1);
			item27.RequiredItems.Add("FlametalNew", 50);
			item27.RequiredItems.Add("SwordDyrnwyn", 1);
			item27.RequiredUpgradeItems.Add("FlametalNew", 5);
			item27.RequiredUpgradeItems.Add("QueenDrop", 1);
			item27.CraftAmount = 1;
			item27.Trade.Price = 0u;
			item27.Trade.Stack = 0u;
			item27.Trade.RequiredGlobalKey = "defeated_bonemass";
			item27.Trade.Trader = Trader.None;
			Item item28 = new Item("wildweapons", "Frigida_CAH");
			item28.Name.English("Frigada");
			item28.Description.English("A deep and ancient sword, harrowing with icy power, even the heat of the Ashlands yields to Frigada's frosty might.");
			item28.Name.Chinese("永冻寒锋");
			item28.Description.Chinese("连熔岩之地都能冰封的远古寒剑。");
			item28.Name.French("Frigada");
			item28.Description.French("Une épée profonde et ancienne, poignardant avec une puissance glaciale, même la chaleur des Ashlands cède à la puissance glaciale de Frigada.");
			item28.Name.Russian("Фригида");
			item28.Description.Russian("Глубокий и древний меч, пронзающий ледяной силой, даже жар Эшленда уступает ледяной мощи Фригады.");
			item28.Crafting.Add(CraftingTable.BlackForge, 3);
			item28.RequiredItems.Add("FreezeGland", 30);
			item28.RequiredItems.Add("FlametalNew", 30);
			item28.RequiredItems.Add("GemstoneBlue", 2);
			item28.RequiredUpgradeItems.Add("FreezeGland", 5);
			item28.RequiredUpgradeItems.Add("FlametalNew", 5);
			item28.CraftAmount = 1;
			item28.Trade.Price = 0u;
			item28.Trade.Stack = 0u;
			item28.Trade.RequiredGlobalKey = "defeated_bonemass";
			item28.Trade.Trader = Trader.None;
			Item item29 = new Item("wildweapons", "EagleStrike_CAH");
			item29.Name.English("Eaglestrike");
			item29.Description.English("A modified version of the silver sword, infused with icy power.");
			item29.Name.Chinese("冰鹰剑");
			item29.Description.Chinese("注入寒冰之力的强化银剑。");
			item29.Name.French("Frappe d'aigle");
			item29.Description.French("Une version modifiée de l'épée d'argent, imprégnée d'un pouvoir glacial.");
			item29.Name.Russian("Удар Орла");
			item29.Description.Russian("Модифицированная версия серебряного меча, наполненная ледяной силой.");
			item29.Crafting.Add(CraftingTable.Forge, 3);
			item29.RequiredItems.Add("SwordSilver", 1);
			item29.RequiredItems.Add("FreezeGland", 15);
			item29.RequiredItems.Add("TrophyHatchling", 3);
			item29.RequiredUpgradeItems.Add("FreezeGland", 5);
			item29.RequiredUpgradeItems.Add("TrophyHatchling", 1);
			item29.CraftAmount = 1;
			item29.Trade.Price = 0u;
			item29.Trade.Stack = 0u;
			item29.Trade.RequiredGlobalKey = "defeated_bonemass";
			item29.Trade.Trader = Trader.None;
			Item item30 = new Item("wildweapons", "AncientHalberd_CAH");
			item30.Name.English("Abraxus");
			item30.Description.English("A well fortified halberd that houses a part of a dragons soul.");
			item30.Name.Chinese("龙魂戟");
			item30.Description.Chinese("封印龙魂的古老战戟。");
			item30.Name.French("Abraxus");
			item30.Description.French("Une hallebarde bien fortifiée qui abrite une partie de l'âme d'un dragon.");
			item30.Name.Russian("Абраксус");
			item30.Description.Russian("Хорошо укрепленная алебарда, в которой заключена часть души дракона.");
			item30.Crafting.Add(CraftingTable.Forge, 5);
			item30.RequiredItems.Add("Bronze", 20);
			item30.RequiredItems.Add("AtgeirBlackmetal", 1);
			item30.RequiredItems.Add("DragonTear", 5);
			item30.RequiredUpgradeItems.Add("Bronze", 1);
			item30.RequiredUpgradeItems.Add("DragonTear", 1);
			item30.CraftAmount = 1;
			item30.Trade.Price = 0u;
			item30.Trade.Stack = 0u;
			item30.Trade.RequiredGlobalKey = "defeated_bonemass";
			item30.Trade.Trader = Trader.None;
			Item item31 = new Item("wildweapons", "StrideBreaker_CAH");
			item31.Name.English("StrideBreaker");
			item31.Description.English("A grand regal axe made explicitly for the execution of dangerous criminals.");
			item31.Name.Chinese("断步刑斧");
			item31.Description.Chinese("专为处决重犯打造的王家巨斧。");
			item31.Name.French("Briseur de foulée");
			item31.Description.French("Une grande hache royale conçue explicitement pour l'exécution de criminels dangereux.");
			item31.Name.Russian("Страйдбрейкер");
			item31.Description.Russian("Большой королевский топор, созданный специально для казни опасных преступников.");
			item31.Crafting.Add(CraftingTable.BlackForge, 3);
			item31.RequiredItems.Add("GemstoneRed", 1);
			item31.RequiredItems.Add("TrophyFader", 1);
			item31.RequiredItems.Add("Silver", 25);
			item31.RequiredItems.Add("Bronze", 25);
			item31.RequiredUpgradeItems.Add("Silver", 5);
			item31.RequiredUpgradeItems.Add("Bronze", 5);
			item31.CraftAmount = 1;
			item31.Trade.Price = 0u;
			item31.Trade.Stack = 0u;
			item31.Trade.RequiredGlobalKey = "defeated_bonemass";
			item31.Trade.Trader = Trader.None;
			Item item32 = new Item("wildweapons", "Rupture_CAH");
			item32.Name.English("Rupture");
			item32.Description.English("A blade forged by combining the twin demon blades and concentrating their power into a deadly weapon.");
			item32.Name.Chinese("破裂");
			item32.Description.Chinese("两把刀融合为一体,结合它们的力量,打造出一件致命的武器。");
			item32.Name.French("Éclatement");
			item32.Description.French("Une lame forgée en combinant deux lames démoniaques et en concentrant leur puissance dans une seule arme mortelle.");
			item32.Name.Russian("Кровоточащий порез");
			item32.Description.Russian("Клинок, выкованный путем объединения двух демонических клинков и концентрации их силы в смертоносное оружие.");
			item32.Crafting.Add(CraftingTable.BlackForge, 3);
			item32.RequiredItems.Add("DemonBlade1_CAH", 1);
			item32.RequiredItems.Add("DemonBlade2_CAH", 1);
			item32.RequiredItems.Add("FlametalNew", 25);
			item32.RequiredItems.Add("GemstoneRed", 1);
			item32.RequiredUpgradeItems.Add("FlametalNew", 5);
			item32.RequiredUpgradeItems.Add("GemstoneRed", 1);
			item32.CraftAmount = 1;
			item32.Trade.Price = 0u;
			item32.Trade.Stack = 0u;
			item32.Trade.RequiredGlobalKey = "defeated_bonemass";
			item32.Trade.Trader = Trader.None;
			Item item33 = new Item("wildweapons", "Regulator_CAH");
			item33.Name.English("Regulator");
			item33.Description.English("A regal dagger made specifically for parrying, it has been through countless battles and has never failed to deflect a blade.");
			item33.Name.Chinese("调节器");
			item33.Description.Chinese("这是一把专为格挡而设计的帝王匕首,它经历了无数场战斗,从未失手。");
			item33.Name.French("Régulateur");
			item33.Description.French("Il s'agit d'une dague impériale conçue pour bloquer les attaques. Elle a survécu à d'innombrables batailles sans jamais faillir.");
			item33.Name.Russian("Регулятор");
			item33.Description.Russian("Это имперский кинжал, предназначенный для блокирования атак. Он выдержал бесчисленные битвы, не подведя.");
			item33.Crafting.Add(CraftingTable.BlackForge, 3);
			item33.RequiredItems.Add("TrophyCharredMelee", 2);
			item33.RequiredItems.Add("FlametalNew", 25);
			item33.RequiredItems.Add("GemstoneRed", 1);
			item33.RequiredUpgradeItems.Add("FlametalNew", 5);
			item33.RequiredUpgradeItems.Add("GemstoneRed", 1);
			item33.CraftAmount = 1;
			item33.Trade.Price = 0u;
			item33.Trade.Stack = 0u;
			item33.Trade.RequiredGlobalKey = "defeated_bonemass";
			item33.Trade.Trader = Trader.None;
			Item item34 = new Item("wildweapons", "StarGleam_CAH");
			item34.Name.English("Stargleam");
			item34.Description.English("A stylish and regal sword forged of only the best materials, it gleams with starlight.");
			item34.Name.Chinese("寻星者");
			item34.Description.Chinese("一把光滑而高贵的剑,仅由最优质的材料锻造而成,闪耀着星光。");
			item34.Name.French("Lumière des étoiles");
			item34.Description.French("Une épée élégante et royale forgée uniquement avec les meilleurs matériaux, elle brille à la lumière des étoiles.");
			item34.Name.Russian("Звездный блеск");
			item34.Description.Russian("Стильный и величественный меч, выкованный из лучших материалов, сияющий в свете звезд.");
			item34.Crafting.Add(CraftingTable.BlackForge, 3);
			item34.RequiredItems.Add("TrophyFader", 1);
			item34.RequiredItems.Add("FlametalNew", 25);
			item34.RequiredItems.Add("GemstoneBlue", 1);
			item34.RequiredUpgradeItems.Add("FlametalNew", 5);
			item34.RequiredUpgradeItems.Add("GemstoneBlue", 1);
			item34.CraftAmount = 1;
			item34.Trade.Price = 0u;
			item34.Trade.Stack = 0u;
			item34.Trade.RequiredGlobalKey = "defeated_bonemass";
			item34.Trade.Trader = Trader.None;
			Item item35 = new Item("wildweapons", "Viridium_CAH");
			item35.Name.English("Viridium");
			item35.Description.English("A brutish green blade that emanates the strength of yggdrasil itself.");
			item35.Name.Chinese("绿刃");
			item35.Description.Chinese("散发着世界树本身力量的野蛮绿色刀刃。");
			item35.Name.French("Viridium");
			item35.Description.French("Une lame verte brutale qui émane la force d'Yggdrasil elle-même.");
			item35.Name.Russian("Виридий");
			item35.Description.Russian("Грубый зеленый клинок, излучающий силу самого Иггдрасиля.");
			item35.Crafting.Add(CraftingTable.BlackForge, 3);
			item35.RequiredItems.Add("TrophyFader", 1);
			item35.RequiredItems.Add("BlackMetal", 25);
			item35.RequiredItems.Add("Bronze", 10);
			item35.RequiredItems.Add("GemstoneGreen", 1);
			item35.RequiredUpgradeItems.Add("BlackMetal", 5);
			item35.RequiredUpgradeItems.Add("GemstoneGreen", 1);
			item35.CraftAmount = 1;
			item35.Trade.Price = 0u;
			item35.Trade.Stack = 0u;
			item35.Trade.RequiredGlobalKey = "defeated_bonemass";
			item35.Trade.Trader = Trader.None;
			Item item36 = new Item("wildweapons", "SunPiercer_CAH");
			item36.Name.English("Sunpiercer");
			item36.Description.English("A magestic and legendary spear, said to once be used by a god to spear the very sun from the sky.");
			item36.Name.Chinese("日陨神枪");
			item36.Description.Chinese("传说中神明用以刺穿烈阳的神圣投枪");
			item36.Name.French("");
			item36.Description.French("");
			item36.Name.Russian("");
			item36.Description.Russian("");
			item36.Crafting.Add(CraftingTable.BlackForge, 3);
			item36.RequiredItems.Add("TrophyFader", 1);
			item36.RequiredItems.Add("FlametalNew", 25);
			item36.RequiredItems.Add("Bronze", 10);
			item36.RequiredItems.Add("GemstoneRed", 1);
			item36.RequiredUpgradeItems.Add("FlametalNew", 5);
			item36.RequiredUpgradeItems.Add("GemstoneRed", 1);
			item36.CraftAmount = 1;
			item36.Trade.Price = 0u;
			item36.Trade.Stack = 0u;
			item36.Trade.RequiredGlobalKey = "defeated_bonemass";
			item36.Trade.Trader = Trader.None;
			Item item37 = new Item("wildweapons", "FairyBow_CAH");
			item37.Name.English("Shimmerspark");
			item37.Description.English("A bow crafted of ancient fairie magic, shimmering in the light.");
			item37.Name.Chinese("战弓·流萤");
			item37.Description.Chinese("由远古妖精魔法锻造的弓身,流光倾泻,熠熠生辉");
			item37.Name.French("");
			item37.Description.French("");
			item37.Name.Russian("");
			item37.Description.Russian("");
			item37.Crafting.Add(CraftingTable.Workbench, 3);
			item37.RequiredItems.Add("FineWood", 25);
			item37.RequiredItems.Add("PowderedDragonEgg", 10);
			item37.RequiredItems.Add("LinenThread", 10);
			item37.RequiredUpgradeItems.Add("FineWood", 5);
			item37.RequiredUpgradeItems.Add("PowderedDragonEgg", 1);
			item37.CraftAmount = 1;
			item37.Trade.Price = 0u;
			item37.Trade.Stack = 0u;
			item37.Trade.RequiredGlobalKey = "defeated_bonemass";
			item37.Trade.Trader = Trader.None;
			Item item38 = new Item("wildweapons", "Astarte_CAH");
			item38.Name.English("圣弓·救世");
			item38.Description.English("Holy bow Astarte, one wielded by a heroic archer who, unlike another self proclaimed hero, actually managed to save his city.");
			item38.Name.Chinese("");
			item38.Description.Chinese("一位微末射手曾怀英雄之梦,于此弓相伴下殉城身殒。它曾真正守护了一座城市,成为不朽传奇——而英雄之名,早已随风雨飘散。——懒懒");
			item38.Name.French("");
			item38.Description.French("");
			item38.Name.Russian("");
			item38.Description.Russian("");
			item38.Crafting.Add(CraftingTable.BlackForge, 3);
			item38.RequiredItems.Add("BowDraugrFang", 1);
			item38.RequiredItems.Add("Eitr", 25);
			item38.RequiredItems.Add("Silver", 15);
			item38.RequiredItems.Add("TrophySeeker", 5);
			item38.RequiredUpgradeItems.Add("Silver", 5);
			item38.RequiredUpgradeItems.Add("Eitr", 5);
			item38.CraftAmount = 1;
			item38.Trade.Price = 0u;
			item38.Trade.Stack = 0u;
			item38.Trade.RequiredGlobalKey = "defeated_bonemass";
			item38.Trade.Trader = Trader.None;
			Item item39 = new Item("wildweapons", "Vecta_CAH");
			item39.Name.English("Vecta");
			item39.Description.English("A strong bow forged from the tough carapace of seekers.");
			item39.Name.Chinese("战弓·逐猎");
			item39.Description.Chinese("用追猎者坚硬甲壳锻造的强韧战弓.");
			item39.Name.French("");
			item39.Description.French("");
			item39.Name.Russian("");
			item39.Description.Russian("");
			item39.Crafting.Add(CraftingTable.BlackForge, 3);
			item39.RequiredItems.Add("TrophySeekerBrute", 1);
			item39.RequiredItems.Add("BlackMetal", 25);
			item39.RequiredItems.Add("Mandible", 10);
			item39.RequiredUpgradeItems.Add("BlackMetal", 5);
			item39.RequiredUpgradeItems.Add("Mandible", 1);
			item39.CraftAmount = 1;
			item39.Trade.Price = 0u;
			item39.Trade.Stack = 0u;
			item39.Trade.RequiredGlobalKey = "defeated_bonemass";
			item39.Trade.Trader = Trader.None;
			Item item40 = new Item("wildweapons", "Skivanti_CAH");
			item40.Name.English("Skivanti");
			item40.Description.English("A mechanical greatbow made to fire high speed arrows.");
			item40.Name.Chinese("连弩·玄机");
			item40.Description.Chinese("可高速连射的机械重弩");
			item40.Name.French("");
			item40.Description.French("");
			item40.Name.Russian("");
			item40.Description.Russian("");
			item40.Crafting.Add(CraftingTable.Forge, 3);
			item40.RequiredItems.Add("Silver", 15);
			item40.RequiredItems.Add("Bronze", 15);
			item40.RequiredItems.Add("DragonTear", 5);
			item40.RequiredUpgradeItems.Add("Silver", 5);
			item40.RequiredUpgradeItems.Add("DragonTear", 1);
			item40.CraftAmount = 1;
			item40.Trade.Price = 0u;
			item40.Trade.Stack = 0u;
			item40.Trade.RequiredGlobalKey = "defeated_bonemass";
			item40.Trade.Trader = Trader.None;
			Item item41 = new Item("wildweapons", "Sieglinde_CAH");
			item41.Name.English("Sieglinde");
			item41.Description.English("A legendary greatbow, capable of loosing deadly arrows at insane speeds.");
			item41.Name.Chinese("战弓·倾霄");
			item41.Description.Chinese("传奇重弓,能以惊人速度倾泻致命箭雨");
			item41.Name.French("");
			item41.Description.French("");
			item41.Name.Russian("");
			item41.Description.Russian("");
			item41.Crafting.Add(CraftingTable.BlackForge, 3);
			item41.RequiredItems.Add("Astarte_CAH", 1);
			item41.RequiredItems.Add("Eitr", 25);
			item41.RequiredItems.Add("FlametalNew", 15);
			item41.RequiredItems.Add("GemstoneBlue", 1);
			item41.RequiredUpgradeItems.Add("Eitr", 5);
			item41.RequiredUpgradeItems.Add("FlametalNew", 5);
			item41.CraftAmount = 1;
			item41.Trade.Price = 0u;
			item41.Trade.Stack = 0u;
			item41.Trade.RequiredGlobalKey = "defeated_bonemass";
			item41.Trade.Trader = Trader.None;
			Item item42 = new Item("wildweapons", "Nocturata_CAH");
			item42.Name.English("Nocturata");
			item42.Description.English("Dark, sleek, and deadly, this bow craves blood.");
			item42.Name.Chinese("战弓·夜泣");
			item42.Description.Chinese("漆黑流线型的嗜血凶弓");
			item42.Name.French("");
			item42.Description.French("");
			item42.Name.Russian("");
			item42.Description.Russian("");
			item42.Crafting.Add(CraftingTable.BlackForge, 3);
			item42.RequiredItems.Add("TrophyFallenValkyrie", 2);
			item42.RequiredItems.Add("BowSpineSnap", 1);
			item42.RequiredItems.Add("GemstoneRed", 1);
			item42.RequiredItems.Add("Feathers", 30);
			item42.RequiredUpgradeItems.Add("FlametalNew", 3);
			item42.RequiredUpgradeItems.Add("Feathers", 10);
			item42.CraftAmount = 1;
			item42.Trade.Price = 0u;
			item42.Trade.Stack = 0u;
			item42.Trade.RequiredGlobalKey = "defeated_bonemass";
			item42.Trade.Trader = Trader.None;
			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
			{
				WildWeaponsLogger.LogDebug((object)"ReadConfigValues called");
				((BaseUnityPlugin)this).Config.Reload();
			}
			catch
			{
				WildWeaponsLogger.LogError((object)("There was an issue loading your " + ConfigFileName));
				WildWeaponsLogger.LogError((object)"Please check your config entries for spelling and format!");
			}
		}

		private ConfigEntry<T> config<[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)] T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags);
			ConfigEntry<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<[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)] T>(string group, string name, T value, string description, bool synchronizedSetting = true)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting);
		}

		static WildWeaponsPlugin()
		{
			string configPath = Paths.ConfigPath;
			char directorySeparatorChar = Path.DirectorySeparatorChar;
			ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
			ConnectionError = "";
			WildWeaponsLogger = Logger.CreateLogSource("WildWeapons");
			ConfigSync = new ConfigSync("catharis.WildWeapons")
			{
				DisplayName = "WildWeapons",
				CurrentVersion = "1.3.3",
				MinimumRequiredVersion = "1.3.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
	{
		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
		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
			WildWeaponsPlugin.WildWeaponsLogger.LogDebug((object)"Registering version RPC handler");
			peer.m_rpc.Register<ZPackage>("WildWeapons_VersionCheck", (Action<ZRpc, ZPackage>)RpcHandlers.RPC_ItemManagerModTemplate_Version);
			WildWeaponsPlugin.WildWeaponsLogger.LogInfo((object)"Invoking version check");
			ZPackage val = new ZPackage();
			val.Write("1.3.3");
			peer.m_rpc.Invoke("WildWeapons_VersionCheck", new object[1] { val });
		}
	}
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	[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;
			}
			WildWeaponsPlugin.WildWeaponsLogger.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(), "WildWeaponsRequestAdminSync", new object[1] { (object)new ZPackage() });
		}
	}
	[HarmonyPatch(typeof(FejdStartup), "ShowConnectError")]
	public class ShowConnectionError
	{
		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
		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" + WildWeaponsPlugin.ConnectionError;
			}
		}
	}
	[HarmonyPatch(typeof(ZNet), "Disconnect")]
	public static class RemoveDisconnectedPeerFromVerified
	{
		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
		private static void Prefix(ZNetPeer peer, ref ZNet __instance)
		{
			if (__instance.IsServer())
			{
				WildWeaponsPlugin.WildWeaponsLogger.LogInfo((object)("Peer (" + peer.m_rpc.m_socket.GetHostName() + ") disconnected, removing from validated list"));
				RpcHandlers.ValidatedPeers.Remove(peer.m_rpc);
			}
		}
	}
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	public static class RpcHandlers
	{
		public static readonly List<ZRpc> ValidatedPeers = new List<ZRpc>();

		public static void RPC_ItemManagerModTemplate_Version(ZRpc rpc, ZPackage pkg)
		{
			string text = pkg.ReadString();
			WildWeaponsPlugin.WildWeaponsLogger.LogInfo((object)("Version check, local: 1.3.3,  remote: " + text));
			if (text != "1.3.3")
			{
				WildWeaponsPlugin.ConnectionError = "WildWeapons Installed: 1.3.3\n Needed: " + text;
				if (ZNet.instance.IsServer())
				{
					WildWeaponsPlugin.WildWeaponsLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") has incompatible version, disconnecting..."));
					rpc.Invoke("Error", new object[1] { 3 });
				}
			}
			else if (!ZNet.instance.IsServer())
			{
				WildWeaponsPlugin.WildWeaponsLogger.LogInfo((object)"Received same version from server!");
			}
			else
			{
				WildWeaponsPlugin.WildWeaponsLogger.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 LocalizationManager
{
	[PublicAPI]
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	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;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		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([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t)));
				}
				return _plugin;
			}
		}

		private static void UpdatePlaceholderText(Localization localization, string key)
		{
			localizationLanguage.TryGetValue(localization, out var value);
			string text = loadedTexts[value][key];
			if (PlaceholderProcessors.TryGetValue(key, out var value2))
			{
				text = value2.Aggregate(text, [<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (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, [<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 2, 1, 1 })] Func<T, string> convertConfigValue = null)
		{
			if (convertConfigValue == null)
			{
				convertConfigValue = (T val) => val.ToString();
			}
			if (!PlaceholderProcessors.ContainsKey(key))
			{
				PlaceholderProcessors[key] = new Dictionary<string, Func<string>>();
			}
			config.SettingChanged += [<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (object _, EventArgs _) =>
			{
				UpdatePlaceholder();
			};
			if (loadedTexts.ContainsKey(Localization.instance.GetSelectedLanguage()))
			{
				UpdatePlaceholder();
			}
			void UpdatePlaceholder()
			{
				PlaceholderProcessors[key][placeholder] = () => convertConfigValue(config.Value);
				UpdatePlaceholderText(Localization.instance, key);
			}
		}

		public static void AddText(string key, string text)
		{
			List<WeakReference<Localization>> list = new List<WeakReference<Localization>>();
			foreach (WeakReference<Localization> localizationObject in localizationObjects)
			{
				if (localizationObject.TryGetTarget(out var target))
				{
					Dictionary<string, string> dictionary = loadedTexts[localizationLanguage.GetOrCreateValue(target)];
					if (!target.m_translations.ContainsKey(key))
					{
						dictionary[key] = text;
						target.AddWord(key, text);
					}
				}
				else
				{
					list.Add(localizationObject);
				}
			}
			foreach (WeakReference<Localization> item in list)
			{
				localizationObjects.Remove(item);
			}
		}

		public static void Load()
		{
			LoadLocalization(Localization.instance, Localization.instance.GetSelectedLanguage());
		}

		private static void LoadLocalization(Localization __instance, string language)
		{
			if (!localizationLanguage.Remove(__instance))
			{
				localizationObjects.Add(new WeakReference<Localization>(__instance));
			}
			localizationLanguage.Add(__instance, language);
			Dictionary<string, string> dictionary = new Dictionary<string, string>();
			foreach (string item in from f in Directory.GetFiles(Path.GetDirectoryName(Paths.PluginPath), plugin.Info.Metadata.Name + ".*", SearchOption.AllDirectories)
				where fileExtensions.IndexOf(Path.GetExtension(f)) >= 0
				select f)
			{
				string text = Path.GetFileNameWithoutExtension(item).Split(new char[1] { '.' })[1];
				if (dictionary.ContainsKey(text))
				{
					Debug.LogWarning((object)("Duplicate key " + text + " found for " + plugin.Info.Metadata.Name + ". The duplicate file found at " + item + " will be skipped."));
				}
				else
				{
					dictionary[text] = item;
				}
			}
			byte[] array = LoadTranslationFromAssembly("English");
			if (array == null)
			{
				throw new Exception("Found no English localizations in mod " + plugin.Info.Metadata.Name + ". Expected an embedded resource translations/English.json or translations/English.yml.");
			}
			Dictionary<string, string> dictionary2 = new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(Encoding.UTF8.GetString(array));
			if (dictionary2 == null)
			{
				throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Localization file was empty.");
			}
			string text2 = null;
			if (language != "English")
			{
				if (dictionary.ContainsKey(language))
				{
					text2 = File.ReadAllText(dictionary[language]);
				}
				else
				{
					byte[] array2 = LoadTranslationFromAssembly(language);
					if (array2 != null)
					{
						text2 = Encoding.UTF8.GetString(array2);
					}
				}
			}
			if (text2 == null && dictionary.ContainsKey("English"))
			{
				text2 = File.ReadAllText(dictionary["English"]);
			}
			if (text2 != null)
			{
				foreach (KeyValuePair<string, string> item2 in new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(text2) ?? new Dictionary<string, string>())
				{
					dictionary2[item2.Key] = item2.Value;
				}
			}
			loadedTexts[language] = dictionary2;
			foreach (KeyValuePair<string, string> item3 in dictionary2)
			{
				UpdatePlaceholderText(__instance, item3.Key);
			}
		}

		static Localizer()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Expected O, but got Unknown
			PlaceholderProcessors = new Dictionary<string, Dictionary<string, Func<string>>>();
			loadedTexts = new Dictionary<string, Dictionary<string, string>>();
			localizationLanguage = new ConditionalWeakTable<Localization, string>();
			localizationObjects = new List<WeakReference<Localization>>();
			fileExtensions = new List<string> { ".json", ".yml" };
			Harmony val = new Harmony("org.bepinex.helpers.LocalizationManager");
			val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalization", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		[return: <53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private static byte[] LoadTranslationFromAssembly(string language)
		{
			foreach (string fileExtension in fileExtensions)
			{
				byte[] array = ReadEmbeddedFileBytes("translations." + language + fileExtension);
				if (array != null)
				{
					return array;
				}
			}
			return null;
		}

		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(2)]
		public static byte[] ReadEmbeddedFileBytes([<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(1)] string resourceFileName, Assembly containingAssembly = null)
		{
			using MemoryStream memoryStream = new MemoryStream();
			if ((object)containingAssembly == null)
			{
				containingAssembly = Assembly.GetCallingAssembly();
			}
			string text = containingAssembly.GetManifestResourceNames().FirstOrDefault([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (string str) => str.EndsWith(resourceFileName, 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
	}
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	public class InternalName : Attribute
	{
		public readonly string internalName;

		public InternalName(string internalName)
		{
			this.internalName = internalName;
		}
	}
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	[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]
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	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
			});
		}
	}
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	[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;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		public ConfigEntryBase RecipeIsActive = null;
	}
	[PublicAPI]
	public class Trade
	{
		public Trader Trader = Trader.None;

		public uint Price = 0u;

		public uint Stack = 1u;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		public string RequiredGlobalKey = null;
	}
	[PublicAPI]
	[Flags]
	public enum Trader
	{
		None = 0,
		Haldor = 1,
		Hildir = 2
	}
	public struct Requirement
	{
		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(1)]
		public string itemName;

		public int amount;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		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;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		public string custom;
	}
	[Flags]
	public enum Configurability
	{
		Disabled = 0,
		Recipe = 1,
		Stats = 2,
		Drop = 4,
		Trader = 8,
		Full = 0xF
	}
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	[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
	{
		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(1)]
		public string creature;

		public int min;

		public int max;

		public float chance;

		public bool levelMultiplier;
	}
	public enum Toggle
	{
		On = 1,
		Off = 0
	}
	[PublicAPI]
	[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
	[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(1)]
	public class Item
	{
		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
		private class ItemConfig
		{
			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 2, 1 })]
			public ConfigEntry<string> craft;

			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 2, 1 })]
			public ConfigEntry<string> upgrade;

			public ConfigEntry<CraftingTable> table = null;

			public ConfigEntry<int> tableLevel = null;

			public ConfigEntry<string> customTable = null;

			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
			public ConfigEntry<int> maximumTableLevel;

			public ConfigEntry<Toggle> requireOneIngredient = null;

			public ConfigEntry<float> qualityResultAmountMultiplier = null;
		}

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
		private class TraderConfig
		{
			public ConfigEntry<Trader> trader = null;

			public ConfigEntry<uint> price = null;

			public ConfigEntry<uint> stack = null;

			public ConfigEntry<string> requiredGlobalKey = null;
		}

		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)]
		private class RequirementQuality
		{
			public int quality;
		}

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(2)]
		private class ConfigurationManagerAttributes
		{
			[UsedImplicitly]
			public int? Order;

			[UsedImplicitly]
			public bool? Browsable;

			[UsedImplicitly]
			public string Category;

			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 2, 1 })]
			[UsedImplicitly]
			public Action<ConfigEntryBase> CustomDrawer;

			public Func<bool> browsability;
		}

		[PublicAPI]
		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)]
		public enum DamageModifier
		{
			Normal,
			Resistant,
			Weak,
			Immune,
			Ignore,
			VeryResistant,
			VeryWeak,
			None
		}

		[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)]
		private delegate void setDmgFunc(ref DamageTypes dmg, float value);

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
		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([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (string r) =>
				{
					string[] array = r.Split(new char[1] { ':' });
					Requirement result = default(Requirement);
					result.itemName = array[0];
					result.amount = ((array.Length <= 1 || !int.TryParse(array[1], out var result2)) ? 1 : result2);
					result.quality = ((array.Length > 2 && int.TryParse(array[2], out var result3)) ? result3 : 0);
					return result;
				}).ToList())
			{
			}

			public override string ToString()
			{
				return string.Join(",", Reqs.Select([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (Requirement r) => $"{r.itemName}:{r.amount}" + ((r.quality > 0) ? $":{r.quality}" : "")));
			}

			[return: <53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
			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
				Dictionary<string, Requirement> dictionary = craft.Reqs.Where((Requirement r) => r.itemName != "").ToDictionary((Func<Requirement, string>)([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (Requirement r) => r.itemName), (Func<Requirement, Requirement>)([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (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([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (Requirement v) => v != null).ToList();
				foreach (Requirement item in upgrade.Reqs.Where((Requirement r) => r.itemName != ""))
				{
					if (item.quality > 0)
					{
						ItemDrop val = ResItem(item);
						if (val != null)
						{
							Requirement val2 = new Requirement
							{
								m_resItem = val,
								m_amountPerLevel = (item.amountConfig?.Value ?? item.amount),
								m_amount = 0
							};
							list.Add(val2);
							requirementQuality.Add(val2, new RequirementQuality
							{
								quality = item.quality
							});
						}
						continue;
					}
					if (!dictionary.TryGetValue(item.itemName, out var value) || value == null)
					{
						ItemDrop val3 = ResItem(item);
						if (val3 != null)
						{
							string itemName = item.itemName;
							Requirement val4 = new Requirement
							{
								m_resItem = val3,
								m_amount = 0
							};
							Requirement val5 = val4;
							dictionary[itemName] = val4;
							value = val5;
							list.Add(value);
						}
					}
					if (value != null)
					{
						value.m_amountPerLevel = item.amountConfig?.Value ?? item.amount;
					}
				}
				return list.ToArray();
				[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(2)]
				ItemDrop ResItem(Requirement r)
				{
					return fetchByName(objectDB, r.itemName);
				}
			}
		}

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
		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([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (string r) =>
				{
					string[] array = r.Split(new char[1] { ':' });
					if (array.Length <= 2 || !int.TryParse(array[2], out var result))
					{
						result = 1;
					}
					if (array.Length <= 3 || !int.TryParse(array[3], out var result2))
					{
						result2 = result;
					}
					bool levelMultiplier = array.Length <= 4 || array[4] != "0";
					DropTarget result3 = default(DropTarget);
					result3.creature = array[0];
					result3.chance = ((array.Length > 1 && float.TryParse(array[1], out var result4)) ? result4 : 1f);
					result3.min = result;
					result3.max = result2;
					result3.levelMultiplier = levelMultiplier;
					return result3;
				}).ToList();
			}

			public override string ToString()
			{
				return string.Join(",", Drops.Select([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (DropTarget r) => $"{r.creature}:{r.chance.ToString(CultureInfo.InvariantCulture)}:{r.min}:" + ((r.min == r.max) ? "" : $"{r.max}") + (r.levelMultiplier ? "" : ":0")));
			}

			[return: <53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
			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;

			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
			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;

			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 0, 1 })]
			private IEnumerable<CodeInstruction> instructions;

			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 0, 1 })]
			public IEnumerable<CodeInstruction> <>3__instructions;

			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 0, 1 })]
			private List<CodeInstruction> <instrs>5__1;

			[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
			private FieldInfo <amountField>5__2;

			private int <i>5__3;

			CodeInstruction IEnumerator<CodeInstruction>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				[return: <53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
				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]
			[return: <53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
			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]
			[return: <53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(0)]
			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>>>();

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 1, 1, 2 })]
		private static Dictionary<Recipe, ConfigEntryBase> hiddenCraftRecipes = new Dictionary<Recipe, ConfigEntryBase>();

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(new byte[] { 1, 1, 2 })]
		private static Dictionary<Recipe, ConfigEntryBase> hiddenUpgradeRecipes = new Dictionary<Recipe, ConfigEntryBase>();

		private static Dictionary<Item, Dictionary<string, ItemConfig>> itemCraftConfigs = new Dictionary<Item, Dictionary<string, ItemConfig>>();

		private static Dictionary<Item, ConfigEntry<string>> itemDropConfigs = new Dictionary<Item, ConfigEntry<string>>();

		private Dictionary<CharacterDrop, Drop> characterDrops = new Dictionary<CharacterDrop, Drop>();

		private readonly Dictionary<ConfigEntryBase, Action> statsConfigs = new Dictionary<ConfigEntryBase, Action>();

		private static readonly ConditionalWeakTable<Requirement, RequirementQuality> requirementQuality = new ConditionalWeakTable<Requirement, RequirementQuality>();

		public static Configurability DefaultConfigurability = Configurability.Full;

		public Configurability? Configurable = null;

		private Configurability configurationVisible = Configurability.Full;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private TraderConfig traderConfig;

		public readonly GameObject Prefab;

		[Description("Specifies the maximum required crafting station level to upgrade and repair the item.\nDefault is calculated from crafting station level and maximum quality.")]
		public int MaximumRequiredStationLevel = int.MaxValue;

		[Description("Assigns the item as a drop item to a creature.\nUses a creature name, a drop chance and a minimum and maximum amount.")]
		public readonly DropTargets DropsFrom = new DropTargets();

		[Description("Configures whether the item can be bought at the trader.\nDon't forget to set cost to something above 0 or the item will be sold for free.")]
		public readonly Trade Trade = new Trade();

		internal List<Conversion> Conversions = new List<Conversion>();

		internal List<ItemConversion> conversions = new List<ItemConversion>();

		public Dictionary<string, ItemRecipe> Recipes = new Dictionary<string, ItemRecipe>();

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private LocalizeKey _name;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private LocalizeKey _description;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private static object configManager;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private static Localization _english;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private static BaseUnityPlugin _plugin;

		private static bool hasConfigSync = true;

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private static object _configSync;

		private Configurability configurability => Configurable ?? DefaultConfigurability;

		[Description("Specifies the resources needed to craft the item.\nUse .Add to add resources with their internal ID and an amount.\nUse one .Add for each resource type the item should need.")]
		public RequiredResourceList RequiredItems => this[""].RequiredItems;

		[Description("Specifies the resources needed to upgrade the item.\nUse .Add to add resources with their internal ID and an amount. This amount will be multipled by the item quality level.\nUse one .Add for each resource type the upgrade should need.")]
		public RequiredResourceList RequiredUpgradeItems => this[""].RequiredUpgradeItems;

		[Description("Specifies the crafting station needed to craft the item.\nUse .Add to add a crafting station, using the CraftingTable enum and a minimum level for the crafting station.\nUse one .Add for each crafting station.")]
		public CraftingStationList Crafting => this[""].Crafting;

		[Description("Specifies a config entry which toggles whether a recipe is active.")]
		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		public ConfigEntryBase RecipeIsActive
		{
			[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(2)]
			get
			{
				return this[""].RecipeIsActive;
			}
			[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(2)]
			set
			{
				this[""].RecipeIsActive = value;
			}
		}

		[Description("Specifies the number of items that should be given to the player with a single craft of the item.\nDefaults to 1.")]
		public int CraftAmount
		{
			get
			{
				return this[""].CraftAmount;
			}
			set
			{
				this[""].CraftAmount = value;
			}
		}

		public bool RequireOnlyOneIngredient
		{
			get
			{
				return this[""].RequireOnlyOneIngredient;
			}
			set
			{
				this[""].RequireOnlyOneIngredient = value;
			}
		}

		public float QualityResultAmountMultiplier
		{
			get
			{
				return this[""].QualityResultAmountMultiplier;
			}
			set
			{
				this[""].QualityResultAmountMultiplier = value;
			}
		}

		public ItemRecipe this[string name]
		{
			get
			{
				if (Recipes.TryGetValue(name, out var value))
				{
					return value;
				}
				return Recipes[name] = new ItemRecipe();
			}
		}

		public LocalizeKey Name
		{
			get
			{
				LocalizeKey name = _name;
				if (name != null)
				{
					return name;
				}
				SharedData shared = Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
				if (shared.m_name.StartsWith("$"))
				{
					_name = new LocalizeKey(shared.m_name);
				}
				else
				{
					string text = "$item_" + ((Object)Prefab).name.Replace(" ", "_");
					_name = new LocalizeKey(text).English(shared.m_name);
					shared.m_name = text;
				}
				return _name;
			}
		}

		public LocalizeKey Description
		{
			get
			{
				LocalizeKey description = _description;
				if (description != null)
				{
					return description;
				}
				SharedData shared = Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
				if (shared.m_description.StartsWith("$"))
				{
					_description = new LocalizeKey(shared.m_description);
				}
				else
				{
					string text = "$itemdesc_" + ((Object)Prefab).name.Replace(" ", "_");
					_description = new LocalizeKey(text).English(shared.m_description);
					shared.m_description = text;
				}
				return _description;
			}
		}

		private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English"));

		private static BaseUnityPlugin plugin
		{
			get
			{
				//IL_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([<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t)));
				}
				return _plugin;
			}
		}

		[<53d0c374-467f-43b8-a0a7-0b3c397b54fd>Nullable(2)]
		private static object configSync
		{
			[<4100fe74-ae8d-44e1-a9e7-d0a26dff9af6>NullableContext(2)]
			get
			{
				if (_configSync == null && hasConfigSync)
				{
					Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync");
					if ((object)type != null)
					{
						_configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " ItemManager");
						type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString());
						type.GetProperty("IsLocked").SetValue(_configSync, true);
					}
					else
					{
						hasConfigSync = false;
					}
				}
				return _configSync;
			}
		}

		public Item(string assetBundleFileName, string prefabName, string folderName = "assets")
			: this(PrefabManager.RegisterAssetBundle(assetBundleFileName, folderName), prefabName)
		{
		}

		public Item(AssetBundle bundle, string prefabName)
			: this(PrefabManager.RegisterPrefab(bundle, prefabName, addToObjectDb: true), skipRegistering: true)
		{
		}

		public Item(GameObject prefab, bool skipRegistering = false)
		{
			if (!skipRegistering)
			{
				PrefabManager.RegisterPrefab(prefab, addToObjectDb: true);
			}
			Prefab = prefab;
			registeredItems.Add(this);
			itemDropMap[Prefab.GetComponent<ItemDrop>()] = this;
			Prefab.GetComponent<ItemDrop>().m_itemData.m_dropPrefab = Prefab;
		}

		public void ToggleConfigurationVisibility(Configurability visible)
		{
			configurationVisible = visible;
			if (itemDropConfigs.TryGetValue(this, out var value))
			{
				Toggle((ConfigEntryBase)(object)value, Configurability.Drop);
			}
			if (itemCraftConfigs.TryGetValue(this, out var value2))
			{
				foreach (ItemConfig value4 in value2.Values)
				{
					ToggleObj(value4, Configurability.Recipe);
				}
			}
			foreach (Conversion conversion in Conversions)
			{
				if (conversion.config != null)
				{
					ToggleObj(conversion.config, Configurability.Recipe);
				}
			}
			foreach (KeyValuePair<ConfigEntryBase, Action> statsConfig in statsConfigs)
			{
				Toggle(statsConfig.Key, Configurability.Stats);
				if ((visible & Configurability.Stats) != 0)
				{
					statsConfig.Value();
				}
			}
			reloadConfigDisplay();
			void Toggle(ConfigEntryBase cfg, Configurability check)
			{
				object[] tags = cfg.Description.Tags;
				foreach (object obj2 in tags)
				{
					if (obj2 is ConfigurationManagerAttributes configurationManagerAttributes)
					{
						configurationManagerAttributes.Browsable = (visible & check) != 0 && (configurationManagerAttributes.browsability == null || configurationManagerAttributes.browsability());
					}
				}
			}
			void ToggleObj(object obj, Configurability check)
			{
				FieldInfo[] fields = obj.GetType().GetFields();
				foreach (FieldInfo fieldInfo in fields)
				{
					object? value3 = fieldInfo.GetValue(obj);
					ConfigEntryBase val = (ConfigEntryBase)((value3 is ConfigEntryBase) ? value3 : null);
					if (val != null)
					{
						Toggle(val, check);
					}
				}
			}
		}

		internal static void reloadConfigDisplay()
		{
			object obj = configManager?.GetType().GetProperty("DisplayingWindow").GetValue(configManager);
			if (obj is bool && (bool)obj)
			{
				configManager.GetType().GetMethod("BuildSettingList").Invoke(configManager, Array.Empty<object>());
			}
		}

		private void UpdateItemTableConfig(string recipeKey, CraftingTable table, string customTableValue)
		{
			if (activeRecipes.ContainsKey(this) && activeRecipes[this].TryGetValue(recipeKey, out var value))
			{
				value.First().m_enabled = table != CraftingTable.Disabled;
				if ((uint)table <= 1u)
				{
					value.First().m_craftingStation = null;
				}
				else if (table == CraftingTable.Custom)
				{
					Recipe obj = value.First();
					GameObject prefab = ZNetScene.instance.GetPrefab(customTableValue);
					obj.m_craftingStation = ((prefab != null) ? prefab.GetComponent<CraftingStation>() : null);
				}
				else
				{
					value.First().m_craftingStation = ZNetScene.instance.GetPrefab(getInternalName(table)).GetComponent<CraftingStation>();
				}
			}
		}

		private void UpdateCraftConfig(string recipeKey, SerializedRequirements craftRequirements, SerializedRequirements upgradeRequirements)
		{
			if (!Object.op_Implicit((Object)(object)ObjectDB.instance) || !activeRecipes.ContainsKey(this) || !activeRecipes[this].TryGetValue(recipeKey, out var value))
			{
				return;
			}
			foreach (Recipe item in value)
			{
				item.m_resources = SerializedRequirements.toPieceReqs(ObjectDB.instance, craftRequirements, upgradeRequirements);
			}
		}

		internal static void Patch_FejdStartup()
		{
			//IL_0ff2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ff7: Unknown result type (might be due to invalid IL or missing references)
			//IL_2386: Unknown result type (might be due to invalid IL or missing references)
			//IL_2390: Expected O, but got Unknown
			//IL_10bf: Unknown result type (might