Decompiled source of balrond cultist armor v1.0.7

plugins/BalrondCultistArmor.dll

Decompiled 3 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 BepInEx;
using HarmonyLib;
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: AssemblyVersion("1.0.0.0")]
namespace BalrondCultistArmor;

[BepInPlugin("balrond.astafaraios.BalrondCultistArmor", "BalrondCultistArmor", "1.0.7")]
public class Launch : BaseUnityPlugin
{
	[HarmonyPatch(typeof(ZNetScene), "Awake")]
	public static class ZNetScene_Awake_Path
	{
		public static void Prefix(ZNetScene __instance)
		{
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance == (Object)null)
			{
				return;
			}
			foreach (GameObject newPrefab2 in vfxList)
			{
				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 prefabs)
			{
				if (!Object.op_Implicit((Object)(object)__instance.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)newPrefab).name)))
				{
					__instance.m_prefabs.Add(newPrefab);
				}
			}
			if (!hasSpawned)
			{
				GameObject val = createUlvMInion(__instance);
				GameObject val2 = vfxList.Find((GameObject x) => ((Object)x).name == "staff_ulv_spawn");
				val2.GetComponent<SpawnAbility>().m_spawnPrefab[0] = val;
				setIronHook(__instance);
				monsterManager.setupMonsters(__instance.m_prefabs, __instance.m_prefabs);
				if (!new ZNet().IsDedicated())
				{
					ShaderReplacment.runMaterialFix();
					hasSpawned = true;
				}
			}
		}
	}

	[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
	public static class Object_CopyOtherDB_Path
	{
		public static void Postfix()
		{
			if (!IsObjectDBValid())
			{
				return;
			}
			foreach (StatusEffect statusEffect in statusEffects)
			{
				AddStatus(statusEffect);
			}
			foreach (GameObject prefab in prefabs)
			{
				AddNewPrefab(prefab);
			}
		}
	}

	[HarmonyPatch(typeof(ObjectDB), "Awake")]
	public static class Object_Awake_Path
	{
		public static void Postfix()
		{
			if (!IsObjectDBValid())
			{
				return;
			}
			foreach (StatusEffect statusEffect in statusEffects)
			{
				AddStatus(statusEffect);
			}
			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.BalrondCultistArmor");

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

	public const string PluginName = "BalrondCultistArmor";

	public const string PluginVersion = "1.0.7";

	private static AssetBundle assetBundle;

	private static readonly string bundleName = "cultistset";

	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 MonsterManager monsterManager = new MonsterManager();

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

	public static GameObject RootObject;

	public static GameObject PrefabContainer;

	public static bool hasSpawned = false;

	private static readonly string[] prefabNames = new string[5] { "ArmorCultistChest", "ArmorCultistLegs", "CapeCultist", "CursedHand", "HelmetCultist" };

	private static readonly string[] resourceNames = new string[4] { "CultInsygnia", "CorruptedEitr", "FenringMeat", "FenringMeatCooked" };

	private static readonly string[] vfxNames = new string[1] { "staff_ulv_spawn" };

	public static Sprite iconSpirit = null;

	public static void createPrefabContainer()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Expected O, but got Unknown
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Expected O, but got Unknown
		RootObject = new GameObject("_ValheimReforgedRoot");
		Object.DontDestroyOnLoad((Object)(object)RootObject);
		PrefabContainer = new GameObject("Prefabs");
		PrefabContainer.transform.parent = RootObject.transform;
		PrefabContainer.SetActive(false);
	}

	public static GameObject cloneMe(GameObject source, string name)
	{
		GameObject val = Object.Instantiate<GameObject>(source, PrefabContainer.transform);
		((Object)val).name = name;
		val = fixMaterials(val, source);
		val.SetActive(true);
		return val;
	}

	public static GameObject fixMaterials(GameObject clone, GameObject source)
	{
		MeshRenderer[] componentsInChildren = source.GetComponentsInChildren<MeshRenderer>();
		foreach (MeshRenderer val in componentsInChildren)
		{
			MeshRenderer[] componentsInChildren2 = clone.GetComponentsInChildren<MeshRenderer>();
			foreach (MeshRenderer val2 in componentsInChildren2)
			{
				if (((Object)val).name == ((Object)val2).name)
				{
					((Renderer)val2).materials = ((Renderer)val).sharedMaterials;
					((Renderer)val2).sharedMaterials = ((Renderer)val).sharedMaterials;
					break;
				}
			}
		}
		return clone;
	}

	private void Awake()
	{
		init();
	}

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

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

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

	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)
	{
		iconSpirit = assetBundle.LoadAsset<Sprite>("Assets/Custom/BalrondFenringCultist/ico/spiritburn1.png");
		string[] array = vfxNames;
		foreach (string text in array)
		{
			GameObject val = assetBundle.LoadAsset<GameObject>("Assets/Custom/BalrondFenringCultist/" + text + ".prefab");
			val.SetActive(true);
			ShaderReplacment.Replace(val);
			vfxList.Add(val);
		}
		string[] array2 = resourceNames;
		foreach (string text2 in array2)
		{
			GameObject val2 = assetBundle.LoadAsset<GameObject>("Assets/Custom/BalrondFenringCultist/" + text2 + ".prefab");
			val2.SetActive(true);
			ShaderReplacment.Replace(val2);
			prefabs.Add(val2);
		}
		string[] array3 = prefabNames;
		foreach (string text3 in array3)
		{
			GameObject val3 = assetBundle.LoadAsset<GameObject>("Assets/Custom/BalrondFenringCultist/" + text3 + ".prefab");
			if (((Object)val3).name == "HelmetCultist")
			{
				val3.GetComponent<ItemDrop>().m_itemData.m_shared.m_name = "Cultist Hood";
			}
			val3.SetActive(true);
			ShaderReplacment.Replace(val3);
			prefabs.Add(val3);
		}
		ItemDrop component = prefabs.Find((GameObject x) => ((Object)x).name == "CapeCultist").GetComponent<ItemDrop>();
		statusEffects.Add(component.m_itemData.m_shared.m_setStatusEffect);
	}

	public static void setIronHook(ZNetScene zNetScene)
	{
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Expected O, but got Unknown
		GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "piece_cookingstation_iron");
		ItemConversion val2 = new ItemConversion();
		val2.m_from = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "FenringMeat").GetComponent<ItemDrop>();
		val2.m_to = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "FenringMeatCooked").GetComponent<ItemDrop>();
		val2.m_cookTime = 40f;
		if ((Object)(object)val != (Object)null)
		{
			CookingStation component = val.GetComponent<CookingStation>();
			component.m_conversion.Add(val2);
		}
	}

	public static void addConsumeFood(MonsterAI monsterAI, ZNetScene __instance, string name)
	{
		monsterAI.m_consumeItems.Add(__instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "BugMeat").GetComponent<ItemDrop>());
	}

	public static GameObject createUlvMInion(ZNetScene __instance)
	{
		//IL_01aa: 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)
		GameObject val = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "Ulv");
		GameObject val2 = cloneMe(val, "Ulv_minion");
		GameObject val3 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "Skeleton_Friendly");
		MonsterAI component = val.GetComponent<MonsterAI>();
		addConsumeFood(component, __instance, "BugMeat");
		addConsumeFood(component, __instance, "ChickenMeat");
		addConsumeFood(component, __instance, "CookedBugMeat");
		addConsumeFood(component, __instance, "CookedChickenMeat");
		addConsumeFood(component, __instance, "CookedDeerMeat");
		addConsumeFood(component, __instance, "CookedMeat");
		addConsumeFood(component, __instance, "DeerMeat");
		addConsumeFood(component, __instance, "CookedWolfMeat");
		addConsumeFood(component, __instance, "CookedHareMeat");
		addConsumeFood(component, __instance, "CookedLoxMeat");
		addConsumeFood(component, __instance, "HareMeat");
		addConsumeFood(component, __instance, "LoxMeat");
		((Character)val.GetComponent<Humanoid>()).m_health = 300f;
		Tameable val4 = val2.AddComponent<Tameable>();
		Tameable component2 = val3.GetComponent<Tameable>();
		val4.m_commandable = true;
		val4.m_startsTamed = true;
		val4.m_fedDuration = component2.m_fedDuration;
		val4.m_petEffect = component2.m_petEffect;
		val4.m_sootheEffect = component2.m_sootheEffect;
		val4.m_tamedEffect = component2.m_tamedEffect;
		val4.m_unsummonDistance = component2.m_unsummonDistance;
		val4.m_unSummonEffect = component2.m_unSummonEffect;
		val4.m_tamingTime = component2.m_tamingTime;
		val4.m_unsummonOnOwnerLogoutSeconds = component2.m_unsummonOnOwnerLogoutSeconds;
		val4.m_levelUpOwnerSkill = component2.m_levelUpOwnerSkill;
		val4.m_levelUpFactor = component2.m_levelUpFactor;
		Object.Destroy((Object)(object)val2.GetComponent<CharacterDrop>());
		__instance.m_prefabs.Add(val2);
		return val2;
	}

	private static bool IsObjectDBValid()
	{
		return (Object)(object)ObjectDB.instance != (Object)null && ObjectDB.instance.m_items.Count != 0 && ObjectDB.instance.m_recipes.Count != 0 && (Object)(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)
	{
		ItemDrop component = newPrefab.GetComponent<ItemDrop>();
		if ((Object)(object)component != (Object)null)
		{
			if ((Object)(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(((object)status).GetHashCode()) == (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)(object)x.GetComponent<MonsterAI>() != (Object)null);
		if (monsters == null)
		{
			Debug.LogWarning((object)"I DID NOT FOUND ANY MONSTERS!");
		}
		else
		{
			changeMonsterDrops();
		}
	}

	private void changeMonsterDrops()
	{
		string[] array = new string[3] { "Ulv", "Fenring", "Fenring_Cultist" };
		string[] array2 = array;
		foreach (string name in array2)
		{
			GameObject val = monsters.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)(object)val != (Object)null)
			{
				monsterLootChange(val);
			}
		}
	}

	private void monsterLootChange(GameObject monster)
	{
		switch (((Object)monster).name)
		{
		case "Ulv":
			addItemToLootTable(monster, "FenringMeat", 1, 1, 0.15f);
			addItemToLootTable(monster, "WolfHairBundle", 1, 1, 0.25f);
			addItemToLootTable(monster, "WolfClaw", 1, 1, 0.15f);
			break;
		case "Fenring":
			addItemToLootTable(monster, "FenringMeat", 1, 1, 0.33f);
			addItemToLootTable(monster, "CultInsygnia", 1, 1, 0.05f);
			addItemToLootTable(monster, "CorruptedEitr", 1, 2, 0.15f);
			addItemToLootTable(monster, "WolfHairBundle", 1, 1, 0.2f);
			addItemToLootTable(monster, "WolfClaw", 1, 1, 0.2f);
			break;
		case "Fenring_Cultist":
			addItemToLootTable(monster, "FenringMeat", 1, 1, 0.33f);
			addItemToLootTable(monster, "CorruptedEitr", 2, 5, 0.7f);
			addItemToLootTable(monster, "CultInsygnia", 1, 2, 0.1f);
			addItemToLootTable(monster, "WolfHairBundle", 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 prefab = FindItem(itemName);
		val.m_prefab = prefab;
		component.m_drops.Add(val);
	}

	private void changeMonsterResistance()
	{
		foreach (GameObject monster in monsters)
		{
			Humanoid component = monster.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				changeResistanceForException(component);
			}
		}
	}

	private GameObject FindItem(string name)
	{
		GameObject val = list.Find((GameObject x) => ((Object)x).name == name);
		if ((Object)(object)val == (Object)null)
		{
			val = list2.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)(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)(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)
	{
		GameObject val = FindItem(name);
		if ((Object)(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_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: Expected I4, but got Unknown
		//IL_003f: 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_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		Faction faction = ((Character)humanoid).m_faction;
		Faction val = faction;
		switch (val - 1)
		{
		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 ShaderReplacment
{
	public static List<GameObject> prefabsToReplaceShader = new List<GameObject>();

	public static List<Material> materialsInPrefabs = new List<Material>();

	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 static List<Shader> shaders = new List<Shader>();

	private static readonly HashSet<Shader> CachedShaders = new HashSet<Shader>();

	public static bool debug = true;

	public static Shader findShader(string name)
	{
		Shader[] array = Resources.FindObjectsOfTypeAll<Shader>();
		if (array.Length == 0)
		{
			Debug.LogWarning((object)"SHADER LIST IS EMPTY!");
			return null;
		}
		if (debug)
		{
		}
		return shaders.Find((Shader x) => ((Object)x).name == name);
	}

	public static Shader GetShaderByName(string name)
	{
		return shaders.Find((Shader x) => ((Object)x).name == name.Trim());
	}

	public static void debugShaderList(List<Shader> shadersRes)
	{
		foreach (Shader shadersRe in shadersRes)
		{
			Debug.LogWarning((object)("SHADER NAME IS: " + ((Object)shadersRe).name));
		}
		debug = false;
	}

	public static void Replace(GameObject gameObject)
	{
		prefabsToReplaceShader.Add(gameObject);
		GetMaterialsInPrefab(gameObject);
	}

	public static void GetMaterialsInPrefab(GameObject gameObject)
	{
		Renderer[] componentsInChildren = gameObject.GetComponentsInChildren<Renderer>(true);
		Renderer[] array = componentsInChildren;
		foreach (Renderer val in array)
		{
			Material[] sharedMaterials = val.sharedMaterials;
			if (sharedMaterials == null || sharedMaterials.Length == 0)
			{
				continue;
			}
			Material[] array2 = sharedMaterials;
			foreach (Material val2 in array2)
			{
				if ((Object)(object)val2 != (Object)null)
				{
					materialsInPrefabs.Add(val2);
				}
			}
		}
	}

	public static void getMeShaders()
	{
		AssetBundle[] array = Resources.FindObjectsOfTypeAll<AssetBundle>();
		AssetBundle[] array2 = array;
		foreach (AssetBundle val in array2)
		{
			IEnumerable<Shader> enumerable3;
			try
			{
				IEnumerable<Shader> enumerable2;
				if (!val.isStreamedSceneAssetBundle || !Object.op_Implicit((Object)(object)val))
				{
					IEnumerable<Shader> enumerable = val.LoadAllAssets<Shader>();
					enumerable2 = enumerable;
				}
				else
				{
					enumerable2 = from shader in ((IEnumerable<string>)val.GetAllAssetNames()).Select((Func<string, Shader>)val.LoadAsset<Shader>)
						where (Object)(object)shader != (Object)null
						select shader;
				}
				enumerable3 = enumerable2;
			}
			catch (Exception)
			{
				continue;
			}
			if (enumerable3 == null)
			{
				continue;
			}
			foreach (Shader item in enumerable3)
			{
				CachedShaders.Add(item);
			}
		}
	}

	public static void runMaterialFix()
	{
		getMeShaders();
		shaders.AddRange(CachedShaders);
		foreach (Material materialsInPrefab in materialsInPrefabs)
		{
			Shader shader = materialsInPrefab.shader;
			if (!((Object)(object)shader == (Object)null))
			{
				string name = ((Object)shader).name;
				if (!(name == "Standard") && name.Contains("Balrond"))
				{
					setProperValue(materialsInPrefab, name);
				}
			}
		}
	}

	private static void setProperValue(Material material, string shaderName)
	{
		string name = shaderName.Replace("Balrond", "Custom");
		name = checkNaming(name);
		Shader shaderByName = GetShaderByName(name);
		if ((Object)(object)shaderByName == (Object)null)
		{
			Debug.LogWarning((object)("Shader not found " + name));
		}
		else
		{
			material.shader = shaderByName;
		}
	}

	private static 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;
	}
}
public class RecipeBuilder
{
	private List<GameObject> pieces;

	private List<GameObject> items;

	private List<GameObject> newItems;

	public List<Recipe> recipes;

	private string[] toRecipe = new string[6] { "ArmorCultistChest", "ArmorCultistLegs", "CapeCultist", "CursedHand", "HelmetCultist", "CultInsygnia" };

	private string[] itemEditNames = new string[18]
	{
		"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"
	};

	private void editItems()
	{
		string[] array = itemEditNames;
		foreach (string text in array)
		{
			GameObject val = FindItem(text);
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogWarning((object)("Could not find: " + text));
			}
			else
			{
				CheckStats(val);
			}
		}
	}

	private void CheckStats(GameObject gameObject)
	{
		switch (((Object)gameObject).name)
		{
		case "SeekerAspic":
			editFoodStat(gameObject, 125, 60, 150);
			break;
		case "YggdrasilPorridge":
			editFoodStat(gameObject, 120, 120, 150);
			break;
		case "StuffedMmushroom":
			editFoodStat(gameObject, 110, 80, 150);
			break;
		case "MushroomOmlette":
			editFoodStat(gameObject, 85, 150, 150);
			break;
		case "draugr_sword":
			editSpiritDamageStat(gameObject, 25);
			break;
		case "draugr_bow":
			editSpiritDamageStat(gameObject, 15);
			break;
		case "draugr_axe":
			editSpiritDamageStat(gameObject, 15);
			break;
		case "skeleton_bow":
		case "skeleton_sword":
		case "Ghost_attack":
			editSpiritDamageStat(gameObject, 10);
			break;
		case "skeleton_bow2":
		case "skeleton_mace":
		case "skeleton_sword2":
		case "gd_king_shoot":
		case "Greydwarf_shaman_attack":
		case "GoblinKing_Beam":
		case "GoblinShaman_attack_fireball":
			editSpiritDamageStat(gameObject, 20);
			break;
		case "imp_fireball_attack":
			editSpiritDamageStat(gameObject, 10);
			break;
		}
	}

	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);
			}
		}
		list.Add(createCorruptedEitrRecipe());
		return list;
	}

	private Recipe createCorruptedEitrRecipe()
	{
		Recipe val = ScriptableObject.CreateInstance<Recipe>();
		val.m_craftingStation = FindStation(pieces, "piece_magetable");
		((Object)val).name = "Recipe_CorruptedEitr";
		val.m_repairStation = val.m_craftingStation;
		val.m_enabled = true;
		val.m_amount = 3;
		val.m_minStationLevel = 1;
		val.m_item = FindItem("Eitr").GetComponent<ItemDrop>();
		List<Requirement> list = new List<Requirement>();
		list.Add(createReq("Thistle", 2, 0));
		list.Add(createReq("DragonTear", 1, 0));
		list.Add(createReq("CorruptedEitr", 5, 0));
		val.m_resources = list.ToArray();
		return val;
	}

	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>();
		CraftingStation craftingStation = FindStation(pieces, "piece_workbench");
		switch (((Object)item).name)
		{
		case "ArmorCultistChest":
			newRecipe.m_craftingStation = craftingStation;
			newRecipe.m_minStationLevel = 2;
			list.Add(createReq("JuteRed", 4, 2));
			list.Add(createReq("WolfPelt", 3, 2));
			list.Add(createReq("CultInsygnia", 5, 3));
			list.Add(createReq("LeatherScraps", 20, 10));
			break;
		case "ArmorCultistLegs":
			newRecipe.m_craftingStation = craftingStation;
			newRecipe.m_minStationLevel = 2;
			list.Add(createReq("JuteRed", 4, 2));
			list.Add(createReq("CultInsygnia", 5, 1));
			list.Add(createReq("WolfPelt", 5, 2));
			list.Add(createReq("LeatherScraps", 20, 10));
			break;
		case "CapeCultist":
			newRecipe.m_craftingStation = craftingStation;
			newRecipe.m_minStationLevel = 2;
			list.Add(createReq("JuteRed", 3, 3));
			list.Add(createReq("WolfPelt", 5, 2));
			list.Add(createReq("LeatherScraps", 0, 12));
			list.Add(createReq("TrophyUlv", 2, 1));
			break;
		case "CursedHand":
			newRecipe.m_craftingStation = craftingStation;
			newRecipe.m_minStationLevel = 2;
			list.Add(createReq("CorruptedEitr", 4, 2));
			list.Add(createReq("CultInsygnia", 2, 1));
			list.Add(createReq("TrophyFenring", 1, 1));
			list.Add(createReq("TrophyUlv", 2, 1));
			break;
		case "CultInsygnia":
			newRecipe.m_craftingStation = craftingStation;
			newRecipe.m_minStationLevel = 2;
			list.Add(createReq("WolfClaw", 2, 0));
			list.Add(createReq("WolfFang", 2, 0));
			list.Add(createReq("Iron", 2, 0));
			list.Add(createReq("WolfHairBundle", 1, 0));
			break;
		case "HelmetCultist":
			newRecipe.m_craftingStation = craftingStation;
			newRecipe.m_minStationLevel = 2;
			list.Add(createReq("TrophyCultist", 1, 1));
			list.Add(createReq("JuteRed", 3, 2));
			list.Add(createReq("CultInsygnia", 2, 1));
			list.Add(createReq("CorruptedEitr", 4, 2));
			break;
		}
		newRecipe.m_resources = list.ToArray();
		return newRecipe;
	}

	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 component = items.Find((GameObject x) => ((Object)x).name == name).GetComponent<ItemDrop>();
		val.m_resItem = component;
		val.m_amount = amount;
		val.m_amountPerLevel = amountPerLevel;
		return val;
	}

	private GameObject FindItem(string name)
	{
		GameObject val = items.Find((GameObject x) => ((Object)x).name == name);
		if ((Object)(object)val == (Object)null)
		{
			val = newItems.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)(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)(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)
	{
		GameObject val = list.Find((GameObject x) => ((Object)x).name == name);
		if ((Object)(object)val != (Object)null)
		{
			return val.GetComponent<CraftingStation>();
		}
		return null;
	}
}