Decompiled source of ReidrheimrFactionWeaponPack v2.0.1

ReidrheimrFactionWeaponPack/BjornheimArtifacts.dll

Decompiled 5 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ValheimReforgedWeapons")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ValheimReforgedWeapons")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("108df065-3a24-4888-8a60-cf793a69379c")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BjornheimArtifacts
{
	public class BuildPieceChanges
	{
		private List<GameObject> buildPieces = new List<GameObject>();

		private List<GameObject> items = new List<GameObject>();

		private List<ItemConversion> allConversions = new List<ItemConversion>();

		public void editBuidlPieces(List<GameObject> buildpieces, List<GameObject> newPieces, List<GameObject> items)
		{
			buildPieces = buildpieces;
			this.items = items;
			createBuildPiecesRecipes(newPieces);
			editFermenter();
			editSmelter();
			editFurnace();
			editKiln();
			editWHeel();
			editRefinery();
			editWIndMIll();
			editSap();
		}

		public void editStations(List<GameObject> buildpieces)
		{
			buildPieces = buildpieces;
			items = buildpieces;
			editFermenter();
			editSmelter();
			editFurnace();
			editKiln();
			editWHeel();
			editRefinery();
			editWIndMIll();
			editSap();
		}

		private void createBuildPiecesRecipes(List<GameObject> newPieces)
		{
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Expected O, but got Unknown
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Expected O, but got Unknown
			GameObject val = items.Find((GameObject x) => ((Object)x).name == "Hammer");
			List<GameObject> pieces = val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces.m_pieces;
			foreach (GameObject piece in newPieces)
			{
				Piece component = piece.GetComponent<Piece>();
				if (!((Object)component == (Object)null))
				{
					CheckForOtherNames(component, component.m_name);
					List<Requirement> list = new List<Requirement>();
					component.m_resources = createResources(piece);
					if ((Object)pieces.Find((GameObject x) => ((Object)x).name == ((Object)piece).name) == (Object)null)
					{
						pieces.Add(piece);
					}
				}
			}
		}

		private CraftingStation FindStation(List<GameObject> list, string name)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			GameObject val = list.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)val != (Object)null)
			{
				return val.GetComponent<CraftingStation>();
			}
			return null;
		}

		private GameObject FindItem(string name)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			GameObject val = items.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)val == (Object)null)
			{
				val = items.Find((GameObject x) => ((Object)x).name == name);
				if ((Object)val != (Object)null)
				{
					return val;
				}
				Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood"));
				return items.Find((GameObject x) => ((Object)x).name == "Wood");
			}
			if ((Object)val != (Object)null)
			{
				return val;
			}
			Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood"));
			return items.Find((GameObject x) => ((Object)x).name == "Wood");
		}

		private Requirement[] createResources(GameObject item)
		{
			List<Requirement> list = new List<Requirement>();
			switch (((Object)item).name)
			{
			case "sacredforge_ext3":
			case "sacredforge_ext2":
			case "sacredforge_ext1":
			case "SacredForge":
			case "GrandForgeV2":
				list.Add(createReq("SwordCheat", 1, 0));
				break;
			}
			return list.ToArray();
		}

		private Requirement createReq(string name, int amount, int amountPerLevel)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			Requirement val = new Requirement();
			val.m_recover = true;
			ItemDrop val2 = (val.m_resItem = items.Find((GameObject x) => ((Object)x).name == name).GetComponent<ItemDrop>());
			val.m_amount = amount;
			val.m_amountPerLevel = amountPerLevel;
			return val;
		}

		private void CheckForOtherNames(Piece piece, string name)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Expected O, but got Unknown
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Expected O, but got Unknown
			Chair component = ((Component)piece).GetComponent<Chair>();
			if ((Object)component != (Object)null)
			{
				component.m_name = name;
			}
			Fermenter component2 = ((Component)piece).GetComponent<Fermenter>();
			if ((Object)component2 != (Object)null)
			{
				component2.m_name = name;
			}
			Door component3 = ((Component)piece).GetComponent<Door>();
			if ((Object)component3 != (Object)null)
			{
				component3.m_name = name;
			}
			ItemStand component4 = ((Component)piece).GetComponent<ItemStand>();
			if ((Object)component4 != (Object)null)
			{
				component4.m_name = name;
			}
			Container component5 = ((Component)piece).GetComponent<Container>();
			if ((Object)component5 != (Object)null)
			{
				component5.m_name = name;
			}
		}

		private void editFermenter()
		{
			GameObject val = buildPieces.Find((GameObject x) => ((Object)x).name == "fermenter");
			Fermenter component = val.GetComponent<Fermenter>();
			component.m_conversion.Add(addFermenterCoversion(FindItem("MeadBaseLightingResistMedium_bal"), FindItem("MediumThunderPotion_bal")));
			component.m_conversion.Add(addFermenterCoversion(FindItem("MeadBaseSpiritResistMedium_bal"), FindItem("MediumSpiritPotion_bal")));
		}

		private ItemConversion addFermenterCoversion(GameObject from, GameObject to)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			ItemConversion val = new ItemConversion();
			val.m_from = from.GetComponent<ItemDrop>();
			val.m_to = to.GetComponent<ItemDrop>();
			val.m_producedItems = 6;
			return val;
		}

		private void editSmelter()
		{
			GameObject val = buildPieces.Find((GameObject x) => ((Object)x).name == "smelter");
			Smelter component = val.GetComponent<Smelter>();
			component.m_secPerProduct = 6f;
			component.m_fuelPerProduct = 3;
			allConversions.AddRange(component.m_conversion);
		}

		private void editFurnace()
		{
			GameObject val = buildPieces.Find((GameObject x) => ((Object)x).name == "blastfurnace");
			Smelter component = val.GetComponent<Smelter>();
			component.m_secPerProduct = 3f;
			component.m_fuelPerProduct = 2;
			foreach (ItemConversion itemConversion in component.m_conversion)
			{
				ItemConversion val2 = allConversions.Find((ItemConversion x) => ((Object)x.m_from).name == ((Object)itemConversion.m_from).name);
				if (val2 == null)
				{
					allConversions.Add(itemConversion);
				}
			}
			component.m_conversion.Clear();
			component.m_conversion.AddRange(allConversions);
		}

		private void editWHeel()
		{
			GameObject val = buildPieces.Find((GameObject x) => ((Object)x).name == "piece_spinningwheel");
			Smelter component = val.GetComponent<Smelter>();
			component.m_secPerProduct = 10f;
		}

		private void editRefinery()
		{
			GameObject val = buildPieces.Find((GameObject x) => ((Object)x).name == "eitrrefinery");
			Smelter component = val.GetComponent<Smelter>();
			component.m_secPerProduct = 10f;
		}

		private void editWIndMIll()
		{
			GameObject val = buildPieces.Find((GameObject x) => ((Object)x).name == "piece_sapcollector");
			SapCollector component = val.GetComponent<SapCollector>();
			component.m_secPerUnit = 15f;
			component.m_maxLevel = 60;
		}

		private void editSap()
		{
			GameObject val = buildPieces.Find((GameObject x) => ((Object)x).name == "windmill");
			Smelter component = val.GetComponent<Smelter>();
			component.m_secPerProduct = 8f;
		}

		private void editKiln()
		{
			GameObject val = buildPieces.Find((GameObject x) => ((Object)x).name == "charcoal_kiln");
			Smelter component = val.GetComponent<Smelter>();
			component.m_secPerProduct = 10f;
		}
	}
	[BepInPlugin("balrond.astafaraios.BjornheimArtifacts", "BjornheimArtifacts", "1.0.1")]
	public class Launch : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		public static class ZNetScene_Awake_Path
		{
			public static void Prefix(ZNetScene __instance)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_000d: Expected O, but got Unknown
				if ((Object)__instance == (Object)null)
				{
					return;
				}
				foreach (GameObject newPrefab3 in vfxList)
				{
					if (!Object.op_Implicit((Object)(object)__instance.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)newPrefab3).name)))
					{
						__instance.m_prefabs.Add(newPrefab3);
					}
				}
				foreach (GameObject newPrefab2 in prefabs)
				{
					if (!Object.op_Implicit((Object)(object)__instance.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)newPrefab2).name)))
					{
						__instance.m_prefabs.Add(newPrefab2);
					}
				}
				foreach (GameObject newPrefab in buildPieces)
				{
					if (!Object.op_Implicit((Object)(object)__instance.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)newPrefab).name)))
					{
						__instance.m_prefabs.Add(newPrefab);
					}
				}
				buildPieceChanges.editBuidlPieces(__instance.m_prefabs, buildPieces, __instance.m_prefabs);
				monsterManager.setupMonsters(__instance.m_prefabs, __instance.m_prefabs);
				editPortal(__instance.m_prefabs, "portal_wood");
				editPortal(__instance.m_prefabs, "portal_stone");
				GameObject playerResistance = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "Player");
				monsterManager.setPlayerResistance(playerResistance);
				buildPieceChanges.editStations(__instance.m_prefabs);
				recipeBuilder.fixWaveGround(__instance.m_prefabs);
			}
		}

		[HarmonyAfter(new string[] { "FactionPowers" })]
		[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
		public static class Object_CopyOtherDB_Path
		{
			public static void Postfix()
			{
				//IL_0095: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a0: Expected O, but got Unknown
				if (!IsObjectDBValid())
				{
					return;
				}
				GameObject val = ObjectDB.instance.m_items.Find((GameObject x) => ((Object)x).name == "Hammer");
				List<GameObject> pieces = val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces.m_pieces;
				foreach (GameObject piece in buildPieces)
				{
					if ((Object)pieces.Find((GameObject x) => ((Object)x).name == ((Object)piece).name) == (Object)null)
					{
						pieces.Add(piece);
					}
				}
				foreach (StatusEffect statusEffect in statusEffects)
				{
					AddStatus(statusEffect);
				}
				StatusEffect val2 = ObjectDB.instance.m_StatusEffects.Find((StatusEffect x) => ((Object)x).name == "Spirit");
				val2.m_icon = iconSpirit;
				foreach (GameObject prefab in prefabs)
				{
					AddNewPrefab(prefab);
				}
			}
		}

		[HarmonyAfter(new string[] { "FactionPowers" })]
		[HarmonyPatch(typeof(ObjectDB), "Awake")]
		public static class Object_Awake_Path
		{
			public static void Postfix()
			{
				//IL_0095: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a0: Expected O, but got Unknown
				if (!IsObjectDBValid())
				{
					return;
				}
				GameObject val = ObjectDB.instance.m_items.Find((GameObject x) => ((Object)x).name == "Hammer");
				List<GameObject> pieces = val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces.m_pieces;
				foreach (GameObject piece in buildPieces)
				{
					if ((Object)pieces.Find((GameObject x) => ((Object)x).name == ((Object)piece).name) == (Object)null)
					{
						pieces.Add(piece);
					}
				}
				foreach (StatusEffect statusEffect in statusEffects)
				{
					AddStatus(statusEffect);
				}
				StatusEffect val2 = ObjectDB.instance.m_StatusEffects.Find((StatusEffect x) => ((Object)x).name == "Spirit");
				val2.m_icon = iconSpirit;
				foreach (GameObject prefab in prefabs)
				{
					AddNewPrefab(prefab);
				}
				recipes.AddRange(recipeBuilder.createRecipes(ObjectDB.instance.m_items, prefabs));
				foreach (Recipe recipe in recipes)
				{
					AddRecipe(recipe);
				}
			}
		}

		private readonly Harmony harmony = new Harmony("balrond.astafaraios.BjornheimArtifacts");

		public const string PluginGUID = "balrond.astafaraios.BjornheimArtifacts";

		public const string PluginName = "BjornheimArtifacts";

		public const string PluginVersion = "1.0.1";

		private static AssetBundle assetBundle;

		private static readonly string bundleName = "factionweapons";

		private static List<GameObject> prefabs = new List<GameObject>();

		private static List<GameObject> buildPieces = new List<GameObject>();

		private static List<GameObject> vfxList = new List<GameObject>();

		private static List<StatusEffect> statusEffects = new List<StatusEffect>();

		public static RecipeBuilder recipeBuilder = new RecipeBuilder();

		public static List<Recipe> recipes = new List<Recipe>();

		public static MonsterManager monsterManager = new MonsterManager();

		public static BuildPieceChanges buildPieceChanges = new BuildPieceChanges();

		private static readonly string[] prefabNames = new string[9] { "Blidhr_bal", "Blidhr_base_bal", "BowRazorStrikes", "FenrirSword_bal", "FenrirSword_base_bal", "Gugnir_bal", "Gugnir_base_bal", "HoundsSycle", "HoundsScythe" };

		private static readonly string[] resourceNames = new string[19]
		{
			"AcidSludge_bal", "Amethyst_bal", "AmethystSteel", "BlackTissue", "Bloodsteel", "DarkSteel", "DvergrHeart", "Electrum", "Frosteel", "GjallCore_bal",
			"GoldBar", "SeedFrost_bal", "SeekerBruteBlood", "MeadBaseLightingResistMedium_bal", "MeadBaseSpiritResistMedium_bal", "MediumSpiritPotion_bal", "MediumThunderPotion_bal", "DraugrInsygnia", "QueenCore"
		};

		private static readonly string[] pieceNames = new string[5] { "SacredForge", "sacredforge_ext1", "sacredforge_ext2", "sacredforge_ext3", "GrandForgeV2" };

		private static readonly string[] vfxNames = new string[12]
		{
			"SacredForgeAltar", "GrandForge", "Wave_Ground", "projectile_runeAxe", "fx_eikthyr_forwardshockwave1", "fx_Lightning1", "vfx_iceblocker_destroyed1", "vfx_scythExplosion", "vfx_scythe_ground", "vfx_scytheSpikeAoe",
			"fx_eikthyr_forwardshockwave2", "vfx_spiritbolt_explosion"
		};

		public static Sprite iconSpirit = null;

		private void Awake()
		{
			Debug.Log((object)"ReidrheimrFactionWeapons loading");
			init();
			Debug.Log((object)"ReidrheimrFactionWeapons done loading");
		}

		private void init()
		{
			LoadAllAssetBundles();
			harmony.PatchAll();
		}

		private void OnDestroy()
		{
			harmony.UnpatchSelf();
		}

		public static void LoadAllAssetBundles()
		{
			assetBundle = GetAssetBundleFromResources(bundleName);
			LoadPrefabs(assetBundle);
			loadStatusFromPotion();
		}

		public static AssetBundle GetAssetBundleFromResources(string filename)
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(filename));
			using Stream stream = executingAssembly.GetManifestResourceStream(name);
			return AssetBundle.LoadFromStream(stream);
		}

		private static void LoadPrefabs(AssetBundle assetBundle)
		{
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			iconSpirit = assetBundle.LoadAsset<Sprite>("Assets/Custom/Comission/FactionWeapons/ico/spiritburn1.png");
			string[] array = vfxNames;
			string[] array2 = array;
			foreach (string text in array2)
			{
				GameObject val = assetBundle.LoadAsset<GameObject>("Assets/Custom/Comission/FactionWeapons/Objects/" + text + ".prefab");
				val.SetActive(true);
				vfxList.Add(val);
			}
			string[] array3 = resourceNames;
			string[] array4 = array3;
			foreach (string text2 in array4)
			{
				GameObject val2 = assetBundle.LoadAsset<GameObject>("Assets/Custom/Comission/FactionWeapons/Resources/" + text2 + ".prefab");
				val2.SetActive(true);
				prefabs.Add(val2);
			}
			string[] array5 = prefabNames;
			string[] array6 = array5;
			foreach (string text3 in array6)
			{
				GameObject val3 = assetBundle.LoadAsset<GameObject>("Assets/Custom/Comission/FactionWeapons/Weapons/" + text3 + ".prefab");
				val3.SetActive(true);
				if (text3 == "Blidhr_bal" || text3 == "Blidhr_base_bal")
				{
					recolorParticleEmitterColorsRecursively(val3, new Color(0f, 0.64f, 1f));
				}
				prefabs.Add(val3);
			}
			string[] array7 = pieceNames;
			string[] array8 = array7;
			foreach (string text4 in array8)
			{
				GameObject val4 = assetBundle.LoadAsset<GameObject>("Assets/Custom/Comission/FactionWeapons/Pieces/" + text4 + ".prefab");
				val4.SetActive(true);
				buildPieces.Add(val4);
			}
		}

		private static void recolorParticleEmitterColorsRecursively(GameObject g, Color c)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: 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)
			ParticleSystem component = g.GetComponent<ParticleSystem>();
			if ((Object)(object)component != (Object)null)
			{
				MainModule main = component.main;
				MinMaxGradient startColor = ((MainModule)(ref main)).startColor;
				c.a = ((MinMaxGradient)(ref startColor)).color.a;
				((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(c);
			}
			for (int i = 0; i < g.transform.childCount; i++)
			{
				recolorParticleEmitterColorsRecursively(((Component)g.transform.GetChild(i)).gameObject, c);
			}
		}

		private static void loadStatusFromPotion()
		{
			string[] source = new string[2] { "MediumSpiritPotion_bal", "MediumThunderPotion_bal" };
			foreach (GameObject prefab in prefabs)
			{
				if (source.Contains(((Object)prefab).name))
				{
					ItemDrop component = prefab.GetComponent<ItemDrop>();
					statusEffects.Add(component.m_itemData.m_shared.m_consumeStatusEffect);
				}
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Fireplace), "UpdateFireplace")]
		public static void Fireplace_UpdateFireplace(Fireplace __instance, ref ZNetView ___m_nview)
		{
			___m_nview.GetZDO().Set("fuel", __instance.m_maxFuel);
		}

		public static void editPortal(List<GameObject> prefbaList, string name)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Expected O, but got Unknown
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Expected O, but got Unknown
			GameObject val = prefbaList.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)val == (Object)null)
			{
				Debug.LogWarning((object)"NO PORTAL FOUND");
				return;
			}
			Piece component = val.GetComponent<Piece>();
			if ((Object)component == (Object)null)
			{
				Debug.LogWarning((object)"NO PIECE FOUND");
				return;
			}
			Requirement[] resources = component.m_resources;
			List<Requirement> list = new List<Requirement>(resources.Length);
			Requirement[] array = resources;
			foreach (Requirement item in array)
			{
				list.Add(item);
			}
			List<Requirement> list2 = list;
			if (!list2.Any((Requirement w) => ((Object)w.m_resItem).name.ToLower().Contains("queen")))
			{
				Requirement val2 = new Requirement();
				val2.m_amount = 1;
				GameObject val3 = prefbaList.Find((GameObject x) => ((Object)x).name == "QueenCore");
				if ((Object)val3 == (Object)null)
				{
					Debug.LogWarning((object)"NO QUEEN CORE FOUND");
					return;
				}
				val2.m_resItem = val3.GetComponent<ItemDrop>();
				val2.m_recover = true;
				list2.Add(val2);
			}
			component.m_resources = list2.ToArray();
		}

		private static bool IsObjectDBValid()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			return (Object)ObjectDB.instance != (Object)null && ObjectDB.instance.m_items.Count != 0 && ObjectDB.instance.m_recipes.Count != 0 && (Object)ObjectDB.instance.GetItemPrefab("Amber") != (Object)null;
		}

		private static void AddRecipe(Recipe recipe)
		{
			int num = ObjectDB.instance.m_recipes.RemoveAll((Recipe x) => ((Object)x).name == ((Object)recipe).name);
			if (num > 0)
			{
				Debug.Log((object)$"Recipe ({((Object)recipe).name}): {num} instances removed.");
			}
			ObjectDB.instance.m_recipes.Add(recipe);
			Debug.Log((object)("Recipe (" + ((Object)recipe).name + ")  added."));
		}

		private static void AddNewPrefab(GameObject newPrefab)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			ItemDrop component = newPrefab.GetComponent<ItemDrop>();
			if ((Object)component != (Object)null)
			{
				if ((Object)ObjectDB.instance.GetItemPrefab(((Object)newPrefab).name) == (Object)null)
				{
					ObjectDB.instance.m_items.Add(newPrefab);
					Dictionary<int, GameObject> dictionary = (Dictionary<int, GameObject>)typeof(ObjectDB).GetField("m_itemByHash", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(ObjectDB.instance);
					dictionary[StringExtensionMethods.GetStableHashCode(((Object)newPrefab).name)] = newPrefab;
					Debug.Log((object)(((Object)newPrefab).name + " - Added to the Game"));
				}
				else
				{
					Debug.LogWarning((object)(((Object)newPrefab).name + " - ItemDrop already exists"));
				}
			}
			else
			{
				Debug.LogError((object)(((Object)newPrefab).name + " - ItemDrop not found on prefab"));
			}
		}

		private static void AddStatus(StatusEffect status)
		{
			if (!IsObjectDBValid())
			{
				return;
			}
			if ((Object)(object)status != (Object)null)
			{
				if ((Object)(object)ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode(((Object)status).name)) == (Object)null)
				{
					ObjectDB.instance.m_StatusEffects.Add(status);
					Debug.Log((object)(((Object)status).name + " - Status Added to the Game"));
				}
			}
			else
			{
				Debug.LogError((object)(((Object)status).name + " - Status not found"));
			}
		}
	}
	public class MonsterManager
	{
		private List<GameObject> monsters;

		private List<GameObject> list;

		private List<GameObject> list2;

		private string[] names = new string[0];

		private string[] thiefName = new string[14]
		{
			"Greyling", "Greydwarf", "Greydwarf_Elite", "Draugr", "Draugr_Elite", "Draugr_Ranged", "Skeleton", "Skeleton_NoArcher", "Skeleton_Poison", "Forsaken",
			"GoblinBrute", "GoblinArcher", "Goblin", "GoblinShaman"
		};

		public void setPlayerResistance(GameObject player)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			Humanoid component = player.GetComponent<Humanoid>();
			((Character)component).m_damageModifiers.m_spirit = (DamageModifier)0;
		}

		public void setupMonsters(List<GameObject> list, List<GameObject> newItemList)
		{
			if (list == null)
			{
				Debug.LogWarning((object)"I DID NOT FOUND PREFAB LIST!");
				return;
			}
			this.list = list;
			list2 = newItemList;
			monsters = list.FindAll((GameObject x) => (Object)x.GetComponent<MonsterAI>() != (Object)null);
			if (monsters == null)
			{
				Debug.LogWarning((object)"I DID NOT FOUND ANY MONSTERS!");
				return;
			}
			changeMonsterResistance();
			changeMonsterDrops();
		}

		private void changeMonsterDrops()
		{
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Expected O, but got Unknown
			string[] array = new string[13]
			{
				"Tick", "Seeker", "SeekerBrute", "Gjall", "DvergerMageIce", "DvergerMageSupport", "DvergerMage", "DvergerMageFire", "Dverger", "Draugr",
				"Draugr_Elite", "Draugr_Ranged", "SeekerQueen"
			};
			string[] array2 = array;
			string[] array3 = array2;
			foreach (string name in array3)
			{
				GameObject val = monsters.Find((GameObject x) => ((Object)x).name == name);
				if ((Object)val != (Object)null)
				{
					monsterLootChange(val);
				}
			}
		}

		private void monsterLootChange(GameObject monster)
		{
			string name = ((Object)monster).name;
			string text = name;
			if (text == null)
			{
				return;
			}
			switch (text.Length)
			{
			case 11:
				switch (text[6])
				{
				case 'r':
					if (text == "DvergerMage")
					{
						addItemToLootTable(monster, "DvergrHeart", 1, 1, 0.25f);
					}
					break;
				case 'B':
					if (text == "SeekerBrute")
					{
						addItemToLootTable(monster, "SeekerBruteBlood", 1, 1, 0.5f);
					}
					break;
				case 'Q':
					if (text == "SeekerQueen")
					{
						addItemToLootTable(monster, "QueenCore", 1, 1, 0.15f);
					}
					break;
				}
				break;
			case 6:
				switch (text[0])
				{
				default:
					return;
				case 'S':
					if (text == "Seeker")
					{
						addItemToLootTable(monster, "AcidSludge_bal", 1, 1, 0.5f);
					}
					return;
				case 'D':
					break;
				}
				if (!(text == "Draugr"))
				{
					break;
				}
				goto IL_02ca;
			case 4:
				if (text == "Tick")
				{
					addItemToLootTable(monster, "BlackTissue", 1, 1, 0.25f);
				}
				break;
			case 14:
				if (text == "DvergerMageIce")
				{
					addItemToLootTable(monster, "DvergrHeart", 1, 1, 0.25f);
					addItemToLootTable(monster, "SeedFrost_bal", 1, 1, 0.75f);
				}
				break;
			case 18:
				if (text == "DvergerMageSupport")
				{
					addItemToLootTable(monster, "DvergrHeart", 1, 1, 0.25f);
					addItemToLootTable(monster, "Amethyst_bal", 1, 1, 0.5f);
				}
				break;
			case 15:
				if (text == "DvergerMageFire")
				{
					addItemToLootTable(monster, "DvergrHeart", 1, 1, 0.25f);
					addItemToLootTable(monster, "Amethyst_bal", 1, 1, 0.25f);
				}
				break;
			case 7:
				if (text == "Dverger")
				{
					addItemToLootTable(monster, "GoldBar", 1, 1, 0.25f);
				}
				break;
			case 5:
				if (text == "Gjall")
				{
					addItemToLootTable(monster, "GjallCore_bal", 1, 1, 1f);
				}
				break;
			case 13:
				if (!(text == "Draugr_Ranged"))
				{
					break;
				}
				goto IL_02ca;
			case 12:
				if (text == "Draugr_Elite")
				{
					addItemToLootTable(monster, "DraugrInsygnia", 1, 1, 0.5f);
				}
				break;
			case 8:
			case 9:
			case 10:
			case 16:
			case 17:
				break;
				IL_02ca:
				addItemToLootTable(monster, "DraugrInsygnia", 1, 1, 0.2f);
				break;
			}
		}

		private void addItemToLootTable(GameObject monster, string itemName, int amountMin, int amountMax, float chance)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			CharacterDrop component = monster.GetComponent<CharacterDrop>();
			Drop val = new Drop();
			val.m_amountMin = amountMin;
			val.m_amountMax = amountMax;
			val.m_chance = chance;
			val.m_levelMultiplier = false;
			GameObject val2 = (val.m_prefab = FindItem(itemName));
			component.m_drops.Add(val);
		}

		private void changeMonsterResistance()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			foreach (GameObject monster in monsters)
			{
				Humanoid component = monster.GetComponent<Humanoid>();
				if ((Object)component != (Object)null)
				{
					changeResistanceForException(component);
				}
			}
		}

		private GameObject FindItem(string name)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			GameObject val = list.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)val == (Object)null)
			{
				val = list2.Find((GameObject x) => ((Object)x).name == name);
				if ((Object)val != (Object)null)
				{
					return val;
				}
				Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood"));
				return list.Find((GameObject x) => ((Object)x).name == "Wood");
			}
			if ((Object)val != (Object)null)
			{
				return val;
			}
			Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood"));
			return list.Find((GameObject x) => ((Object)x).name == "Wood");
		}

		private CraftingStation FindStation(string name)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			GameObject val = FindItem(name);
			if ((Object)val != (Object)null)
			{
				return val.GetComponent<CraftingStation>();
			}
			return null;
		}

		private void changeSpiritResistance(Humanoid humanoid)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected I4, but got Unknown
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			switch ((int)((Character)humanoid).m_faction)
			{
			case 0:
				((Character)humanoid).m_damageModifiers.m_spirit = (DamageModifier)0;
				break;
			case 1:
				((Character)humanoid).m_damageModifiers.m_spirit = (DamageModifier)1;
				break;
			case 5:
				((Character)humanoid).m_damageModifiers.m_spirit = (DamageModifier)5;
				break;
			case 2:
				((Character)humanoid).m_damageModifiers.m_spirit = (DamageModifier)2;
				break;
			case 3:
				((Character)humanoid).m_damageModifiers.m_spirit = (DamageModifier)2;
				break;
			case 6:
				((Character)humanoid).m_damageModifiers.m_spirit = (DamageModifier)1;
				break;
			case 4:
				((Character)humanoid).m_damageModifiers.m_spirit = (DamageModifier)5;
				break;
			case 8:
				((Character)humanoid).m_damageModifiers.m_spirit = (DamageModifier)5;
				break;
			case 7:
				break;
			}
		}

		private void changeResistanceForException(Humanoid humanoid)
		{
			changeSpiritResistance(humanoid);
		}
	}
	public class RecipeBuilder
	{
		private List<GameObject> pieces;

		private List<GameObject> items;

		private List<GameObject> newItems;

		public List<Recipe> recipes;

		private string[] toRecipe = new string[17]
		{
			"Blidhr_bal", "Blidhr_base_bal", "BowRazorStrikes", "FenrirSword_bal", "FenrirSword_base_bal", "Gugnir_bal", "Gugnir_base_bal", "HoundsSycle", "Electrum", "Frosteel",
			"GoldBar", "Bloodsteel", "HoundsScythe", "DarkSteel", "AmethystSteel", "MeadBaseLightingResistMedium_bal", "MeadBaseSpiritResistMedium_bal"
		};

		private string[] itemEditNames = new string[19]
		{
			"SeekerAspic", "YggdrasilPorridge", "MagicallyStuffedShroom", "MushroomOmelette", "draugr_sword", "draugr_bow", "draugr_axe", "skeleton_bow", "skeleton_mace", "skeleton_sword2",
			"skeleton_bow2", "skeleton_sword2", "imp_fireball_attack", "Ghost_attack", "gd_king_shoot", "Greydwarf_shaman_attack", "GoblinKing_Beam", "GoblinShaman_attack_fireball", "BowRazorStrikes"
		};

		private void editItems()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			string[] array = itemEditNames;
			string[] array2 = array;
			foreach (string text in array2)
			{
				GameObject val = FindItem(text);
				if ((Object)val == (Object)null)
				{
					Debug.LogWarning((object)("Could not find: " + text));
				}
				else
				{
					CheckStats(val);
				}
			}
		}

		private void CheckStats(GameObject gameObject)
		{
			string name = ((Object)gameObject).name;
			string text = name;
			if (text == null)
			{
				return;
			}
			switch (text.Length)
			{
			case 12:
				switch (text[0])
				{
				default:
					return;
				case 'd':
					if (text == "draugr_sword")
					{
						editSpiritDamageStat(gameObject, 25);
					}
					return;
				case 's':
					if (!(text == "skeleton_bow"))
					{
						return;
					}
					break;
				case 'G':
					if (!(text == "Ghost_attack"))
					{
						return;
					}
					break;
				}
				goto IL_0243;
			case 10:
				switch (text[7])
				{
				case 'b':
					if (text == "draugr_bow")
					{
						editSpiritDamageStat(gameObject, 15);
					}
					break;
				case 'a':
					if (text == "draugr_axe")
					{
						editSpiritDamageStat(gameObject, 15);
					}
					break;
				}
				break;
			case 13:
				switch (text[9])
				{
				default:
					return;
				case 'b':
					if (!(text == "skeleton_bow2"))
					{
						return;
					}
					break;
				case 'm':
					if (!(text == "skeleton_mace"))
					{
						return;
					}
					break;
				case 'h':
					if (!(text == "gd_king_shoot"))
					{
						return;
					}
					break;
				}
				goto IL_024f;
			case 15:
				switch (text[0])
				{
				default:
					return;
				case 's':
					if (!(text == "skeleton_sword2"))
					{
						return;
					}
					break;
				case 'G':
					if (!(text == "GoblinKing_Beam"))
					{
						return;
					}
					break;
				case 'B':
					if (text == "BowRazorStrikes")
					{
						editStatsRazorStrike(gameObject, 94, 0, 10, 10, 0, 10);
					}
					return;
				}
				goto IL_024f;
			case 14:
				if (!(text == "skeleton_sword"))
				{
					break;
				}
				goto IL_0243;
			case 23:
				if (!(text == "Greydwarf_shaman_attack"))
				{
					break;
				}
				goto IL_024f;
			case 28:
				if (!(text == "GoblinShaman_attack_fireball"))
				{
					break;
				}
				goto IL_024f;
			case 19:
				{
					if (text == "imp_fireball_attack")
					{
						editSpiritDamageStat(gameObject, 10);
					}
					break;
				}
				IL_0243:
				editSpiritDamageStat(gameObject, 10);
				break;
				IL_024f:
				editSpiritDamageStat(gameObject, 20);
				break;
			}
		}

		private void editStatsRazorStrike(GameObject gameObject, int pierce, int fire, int frost, int lightning, int poison, int spirit)
		{
			ItemDrop component = gameObject.GetComponent<ItemDrop>();
			component.m_itemData.m_shared.m_damages.m_pierce = pierce;
			component.m_itemData.m_shared.m_damages.m_fire = fire;
			component.m_itemData.m_shared.m_damages.m_frost = frost;
			component.m_itemData.m_shared.m_damages.m_lightning = lightning;
			component.m_itemData.m_shared.m_damages.m_poison = poison;
			component.m_itemData.m_shared.m_damages.m_spirit = spirit;
			component.m_itemData.m_shared.m_damagesPerLevel.m_pierce = 4f;
			component.m_itemData.m_shared.m_damagesPerLevel.m_fire = 0f;
			component.m_itemData.m_shared.m_damagesPerLevel.m_frost = 4f;
			component.m_itemData.m_shared.m_damagesPerLevel.m_lightning = 4f;
			component.m_itemData.m_shared.m_damagesPerLevel.m_poison = 0f;
			component.m_itemData.m_shared.m_damagesPerLevel.m_spirit = 4f;
		}

		private void editSpiritDamageStat(GameObject gameObject, int spiritDamage)
		{
			ItemDrop component = gameObject.GetComponent<ItemDrop>();
			component.m_itemData.m_shared.m_damages.m_spirit = spiritDamage;
			if (((Object)gameObject).name == "skeleton_mace" || ((Object)gameObject).name == "imp_fireball_attack")
			{
				component.m_itemData.m_shared.m_damages.m_blunt += spiritDamage;
			}
		}

		private void editFoodStat(GameObject gameObject, int hp, int stam, int eitr)
		{
			ItemDrop component = gameObject.GetComponent<ItemDrop>();
			component.m_itemData.m_shared.m_food = hp;
			component.m_itemData.m_shared.m_foodStamina = stam;
			component.m_itemData.m_shared.m_foodEitr = eitr;
		}

		public List<Recipe> createRecipes(List<GameObject> items, List<GameObject> newItems)
		{
			this.items = items;
			this.newItems = newItems;
			pieces = items.Find((GameObject x) => ((Object)x).name == "Hammer").GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces.m_pieces;
			List<Recipe> list = new List<Recipe>();
			CraftingStation component = pieces.Find((GameObject x) => ((Object)x).name == "forge").GetComponent<CraftingStation>();
			int minStationLevel = 3;
			foreach (GameObject newItem in newItems)
			{
				if (toRecipe.Contains(((Object)newItem).name))
				{
					Recipe val = ScriptableObject.CreateInstance<Recipe>();
					val.m_craftingStation = component;
					val.m_repairStation = component;
					val.m_minStationLevel = minStationLevel;
					val = createResources(newItem, val);
					list.Add(val);
				}
			}
			editItems();
			return list;
		}

		public Sprite LoadNewSprite(string FilePath, float PixelsPerUnit = 100f)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = LoadTexture(FilePath);
			return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0f, 0f), PixelsPerUnit);
		}

		public Texture2D LoadTexture(string fileName)
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(fileName));
			using (Stream stream = executingAssembly.GetManifestResourceStream(name))
			{
				byte[] array = new byte[stream.Length];
				stream.Read(array, 0, (int)stream.Length);
				Texture2D val = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val, array))
				{
					return val;
				}
			}
			return null;
		}

		private Recipe createResources(GameObject item, Recipe newRecipe)
		{
			((Object)newRecipe).name = "Recipe_" + ((Object)item).name;
			newRecipe.m_item = item.GetComponent<ItemDrop>();
			newRecipe.m_amount = 1;
			newRecipe.m_enabled = true;
			List<Requirement> list = new List<Requirement>();
			switch (((Object)item).name)
			{
			case "Blidhr_base_bal":
			{
				item.GetComponent<ItemDrop>().m_itemData.m_shared.m_name = "Freyrs Rune Axe";
				list.Add(createReq("DarkSteel", 10, 5));
				list.Add(createReq("ElderBark", 10, 2));
				list.Add(createReq("Silver", 10, 2));
				list.Add(createReq("AncientSeed", 15, 6));
				List<Sprite> list3 = new List<Sprite>();
				list3.Add(LoadNewSprite("bladhir_base_ico.png"));
				item.GetComponent<ItemDrop>().m_itemData.m_shared.m_icons = list3.ToArray();
				break;
			}
			case "Blidhr_bal":
			{
				newRecipe.m_craftingStation = FindStation(pieces, "SacredForge");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("Blidhr_base_bal", 1, 0));
				list.Add(createReq("AmethystSteel", 8, 4));
				list.Add(createReq("AcidSludge_bal", 20, 10));
				list.Add(createReq("YmirRemains", 20, 10));
				List<Sprite> list2 = new List<Sprite>();
				list2.Add(LoadNewSprite("bladhir_ico.png"));
				item.GetComponent<ItemDrop>().m_itemData.m_shared.m_icons = list2.ToArray();
				break;
			}
			case "BowRazorStrikes":
				newRecipe.m_craftingStation = FindStation(pieces, "piece_workbench");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("Electrum", 15, 5));
				list.Add(createReq("Eitr", 30, 2));
				list.Add(createReq("MediumSpiritPotion_bal", 5, 2));
				break;
			case "FenrirSword_bal":
				newRecipe.m_craftingStation = FindStation(pieces, "SacredForge");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("FenrirSword_base_bal", 1, 0));
				list.Add(createReq("Frosteel", 8, 4));
				list.Add(createReq("SeedFrost_bal", 20, 10));
				list.Add(createReq("Crystal", 20, 10));
				break;
			case "FenrirSword_base_bal":
				list.Add(createReq("DarkSteel", 10, 5));
				list.Add(createReq("ElderBark", 10, 2));
				list.Add(createReq("Silver", 10, 2));
				list.Add(createReq("WolfPelt", 10, 2));
				break;
			case "Gugnir_base_bal":
				item.GetComponent<ItemDrop>().m_itemData.m_shared.m_name = "Spear of Penitents";
				list.Add(createReq("DarkSteel", 10, 5));
				list.Add(createReq("ElderBark", 10, 2));
				list.Add(createReq("Silver", 10, 2));
				list.Add(createReq("MushroomYellow", 20, 5));
				break;
			case "Gugnir_bal":
				newRecipe.m_craftingStation = FindStation(pieces, "SacredForge");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("Gugnir_base_bal", 1, 0));
				list.Add(createReq("Electrum", 8, 4));
				list.Add(createReq("GoldBar", 20, 10));
				list.Add(createReq("Thunderstone", 20, 10));
				break;
			case "HoundsSycle":
				list.Add(createReq("DarkSteel", 10, 5));
				list.Add(createReq("ElderBark", 10, 2));
				list.Add(createReq("Silver", 10, 2));
				list.Add(createReq("Bloodbag", 15, 6));
				break;
			case "HoundsScythe":
				newRecipe.m_craftingStation = FindStation(pieces, "SacredForge");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("HoundsSycle", 1, 0));
				list.Add(createReq("Bloodsteel", 8, 4));
				list.Add(createReq("BlackTissue", 20, 10));
				list.Add(createReq("SurtlingCore", 20, 10));
				break;
			case "Electrum":
				newRecipe.m_craftingStation = FindStation(pieces, "SacredForge");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("FlametalNew", 4, 0));
				list.Add(createReq("DarkSteel", 3, 0));
				list.Add(createReq("GjallCore_bal", 5, 0));
				list.Add(createReq("Coal", 8, 0));
				break;
			case "Frosteel":
				newRecipe.m_craftingStation = FindStation(pieces, "SacredForge");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("FlametalNew", 4, 0));
				list.Add(createReq("DarkSteel", 3, 0));
				list.Add(createReq("SeedFrost_bal", 5, 0));
				list.Add(createReq("Coal", 8, 0));
				break;
			case "GoldBar":
				newRecipe.m_minStationLevel = 5;
				list.Add(createReq("Coins", 999, 0));
				list.Add(createReq("Coal", 10, 0));
				break;
			case "Bloodsteel":
				newRecipe.m_craftingStation = FindStation(pieces, "SacredForge");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("FlametalNew", 4, 0));
				list.Add(createReq("DarkSteel", 3, 0));
				list.Add(createReq("SeekerBruteBlood", 5, 0));
				list.Add(createReq("Coal", 8, 0));
				break;
			case "DarkSteel":
				list.Add(createReq("Iron", 3, 0));
				list.Add(createReq("Obsidian", 6, 0));
				list.Add(createReq("Coal", 5, 0));
				break;
			case "AmethystSteel":
				newRecipe.m_craftingStation = FindStation(pieces, "SacredForge");
				newRecipe.m_minStationLevel = 1;
				list.Add(createReq("FlametalNew", 4, 0));
				list.Add(createReq("DarkSteel", 3, 0));
				list.Add(createReq("Amethyst_bal", 5, 0));
				list.Add(createReq("Coal", 8, 0));
				break;
			case "MeadBaseLightingResistMedium_bal":
				newRecipe.m_craftingStation = FindStation(pieces, "piece_cauldron");
				newRecipe.m_minStationLevel = 2;
				list.Add(createReq("Thunderstone", 3, 0));
				list.Add(createReq("Thistle", 5, 0));
				list.Add(createReq("GreydwarfEye", 25, 0));
				list.Add(createReq("TrophyFrostTroll", 2, 0));
				break;
			case "MeadBaseSpiritResistMedium_bal":
				newRecipe.m_craftingStation = FindStation(pieces, "piece_cauldron");
				newRecipe.m_minStationLevel = 2;
				list.Add(createReq("DraugrInsygnia", 6, 0));
				list.Add(createReq("Honey", 10, 0));
				list.Add(createReq("Bloodbag", 4, 0));
				list.Add(createReq("TrophyGreydwarfShaman", 2, 0));
				break;
			}
			newRecipe.m_resources = list.ToArray();
			return newRecipe;
		}

		public Requirement createReq(string name, int amount, int amountPerLevel)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			Requirement val = new Requirement();
			val.m_recover = true;
			ItemDrop val2 = (val.m_resItem = items.Find((GameObject x) => ((Object)x).name == name).GetComponent<ItemDrop>());
			val.m_amount = amount;
			val.m_amountPerLevel = amountPerLevel;
			return val;
		}

		private GameObject FindItem(string name)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			GameObject val = items.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)val == (Object)null)
			{
				val = newItems.Find((GameObject x) => ((Object)x).name == name);
				if ((Object)val != (Object)null)
				{
					return val;
				}
				Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood"));
				return items.Find((GameObject x) => ((Object)x).name == "Wood");
			}
			if ((Object)val != (Object)null)
			{
				return val;
			}
			Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood"));
			return items.Find((GameObject x) => ((Object)x).name == "Wood");
		}

		private CraftingStation FindStation(List<GameObject> list, string name)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			GameObject val = list.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)val != (Object)null)
			{
				return val.GetComponent<CraftingStation>();
			}
			return null;
		}

		internal void fixWaveGround(List<GameObject> m_prefabs)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				GameObject g = m_prefabs.Find((GameObject x) => ((Object)x).name == "Wave_Ground");
				recolorParticleEmitterColorsRecursively(g, new Color(0f, 0.64f, 1f));
				GameObject g2 = m_prefabs.Find((GameObject x) => ((Object)x).name == "vfx_spiritbolt_explosion");
				recolorParticleEmitterColorsRecursively(g2, new Color(0f, 0.64f, 1f));
				GameObject val = m_prefabs.Find((GameObject x) => ((Object)x).name == "Blidhr_base_bal");
				Transform val2 = RecursiveFindChild(val.transform, "RuneRock_3 (1)");
				((Component)val2).GetComponent<Renderer>().material.SetColor("_EmissionColor", new Color(0f, 0.6f, 1f));
				GameObject val3 = m_prefabs.Find((GameObject x) => ((Object)x).name == "Blidhr_bal");
				Transform val4 = RecursiveFindChild(val3.transform, "RuneRock_1");
				((Component)val4).GetComponent<Renderer>().material.SetColor("_EmissionColor", new Color(0f, 0.6f, 1f));
			}
			catch (Exception ex)
			{
				Debug.Log((object)"######################################################################");
				Debug.Log((object)"Failed to fixwaveground");
				Debug.Log((object)ex);
			}
		}

		private static void recolorParticleEmitterColorsRecursively(GameObject g, Color c)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			ParticleSystem component = g.GetComponent<ParticleSystem>();
			if ((Object)(object)component != (Object)null)
			{
				MainModule main = component.main;
				MinMaxGradient startColor = ((MainModule)(ref main)).startColor;
				c.a = ((MinMaxGradient)(ref startColor)).color.a;
				((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(c);
				TrailModule trails = component.trails;
				if (((TrailModule)(ref trails)).enabled)
				{
					TrailModule trails2 = component.trails;
					((TrailModule)(ref trails2)).colorOverLifetime = MinMaxGradient.op_Implicit(c);
				}
				ColorOverLifetimeModule colorOverLifetime = component.colorOverLifetime;
				if (((ColorOverLifetimeModule)(ref colorOverLifetime)).enabled)
				{
					try
					{
						ColorOverLifetimeModule colorOverLifetime2 = component.colorOverLifetime;
						((ColorOverLifetimeModule)(ref colorOverLifetime2)).color = MinMaxGradient.op_Implicit(c);
					}
					catch (Exception ex)
					{
						Debug.Log((object)"######################################################################");
						Debug.Log((object)"Failed to recolorParticleEmitterColorsRecursively");
						Debug.Log((object)ex);
					}
				}
			}
			for (int i = 0; i < g.transform.childCount; i++)
			{
				recolorParticleEmitterColorsRecursively(((Component)g.transform.GetChild(i)).gameObject, c);
			}
		}

		private Transform RecursiveFindChild(Transform parent, string childName)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			foreach (Transform item in parent)
			{
				Transform val = item;
				if (((Object)val).name == childName)
				{
					return val;
				}
				Transform val2 = RecursiveFindChild(val, childName);
				if ((Object)(object)val2 != (Object)null)
				{
					return val2;
				}
			}
			return null;
		}
	}
	public class ShaderReplacment
	{
		public string[] shaderlist = new string[49]
		{
			"Custom/AlphaParticle", "Custom/Blob", "Custom/Bonemass", "Custom/Clouds", "Custom/Creature", "Custom/Decal", "Custom/Distortion", "Custom/Flow", "Custom/FlowOpaque", "Custom/Grass",
			"Custom/GuiScroll", "Custom/Heightmap", "Custom/icon", "Custom/InteriorSide", "Custom/LitGui", "Custom/LitParticles", "Custom/mapshader", "Custom/ParticleDecal", "Custom/Piece", "Custom/Player",
			"Custom/Rug", "Custom/ShadowBlob", "Custom/SkyboxProcedural", "Custom/SkyObject", "Custom/StaticRock", "Custom/Tar", "Custom/Trilinearmap", "Custom/UI/BGBlur", "Custom/Vegetation", "Custom/Water",
			"Custom/WaterBottom", "Custom/WaterMask", "Custom/Yggdrasil", "Custom/Yggdrasil/root", "Hidden/BlitCopyHDRTonemap", "Hidden/Dof/DepthOfFieldHdr", "Hidden/Dof/DX11Dof", "Hidden/Internal-Loading", "Hidden/Internal-UIRDefaultWorld", "Hidden/SimpleClear",
			"Hidden/SunShaftsComposite", "Lux Lit Particles/ Bumped", "Lux Lit Particles/ Tess Bumped", "Particles/Standard Surface2", "Particles/Standard Unlit2", "Standard TwoSided", "ToonDeferredShading2017", "Unlit/DepthWrite", "Unlit/Lighting"
		};

		public List<Shader> shaders = new List<Shader>();

		public void findShadersByName()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			string[] array = shaderlist;
			string[] array2 = array;
			foreach (string text in array2)
			{
				Shader val = Shader.Find(text);
				if ((Object)val != (Object)null)
				{
					shaders.Add(val);
				}
			}
		}

		public void ReplaceShadersInObject(GameObject gameObject)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Expected O, but got Unknown
			if ((Object)gameObject == (Object)null)
			{
				return;
			}
			Renderer[] componentsInChildren = gameObject.GetComponentsInChildren<Renderer>();
			if (componentsInChildren == null || componentsInChildren.Length == 0)
			{
				return;
			}
			Renderer[] array = componentsInChildren;
			Renderer[] array2 = array;
			foreach (Renderer val in array2)
			{
				int num = 0;
				Material[] sharedMaterials = val.sharedMaterials;
				if (sharedMaterials == null || sharedMaterials.Length == 0)
				{
					continue;
				}
				Material[] array3 = sharedMaterials;
				Material[] array4 = array3;
				foreach (Material val2 in array4)
				{
					string name = ((Object)val2.shader).name;
					if (!(name == "Standard") && name.Contains("Balrond"))
					{
						string name2 = name.Replace("Balrond", "Custom");
						name2 = checkNaming(name2);
						Shader val3 = Shader.Find(name2);
						if ((Object)val3 == (Object)null)
						{
							Debug.LogWarning((object)("[Project Ashlands]: Shader not found " + name2));
							continue;
						}
						val2.shader = val3;
						num++;
					}
				}
			}
		}

		private string checkNaming(string name)
		{
			string result = name;
			if (name.Contains("Bumped"))
			{
				result = name.Replace("Custom", "Lux Lit Particles");
			}
			if (name.Contains("Tess Bumped"))
			{
				result = name.Replace("Custom", "Lux Lit Particles");
			}
			if (name.Contains("Standard Surface"))
			{
				result = name.Replace("Custom", "Particles");
				result = result.Replace("Standard Surface2", "Standard Surface");
			}
			if (name.Contains("Standard Unlit"))
			{
				result = name.Replace("Custom", "Particles");
				result = result.Replace("Standard Unlit", "Standard Unlit2");
				result = result.Replace("Standard Unlit22", "Standard Unlit2");
			}
			return result;
		}
	}
}