Decompiled source of Hugos Armory v8.3.6

ValheimHTDArmory.dll

Decompiled 7 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
using ServerSync;
using TMPro;
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("ValheimHTDArmory")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ValheimHTDArmory")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyFileVersion("8.3.5")]
[assembly: Guid("3f0e3454-5e9d-41aa-a53d-c3f412189855")]
[assembly: ComVisible(false)]
[assembly: AssemblyTrademark("")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("8.3.5.0")]
[module: UnverifiableCode]
public class UpgradeMods : MonoBehaviour
{
	private bool persistPastLevel2 = true;

	private bool persistPastLevel3 = true;

	private void Start()
	{
		((Component)((Component)this).transform.Find("levelmods/lvl1")).gameObject.SetActive(false);
		((Component)((Component)this).transform.Find("levelmods/lvl2")).gameObject.SetActive(false);
		((Component)((Component)this).transform.Find("levelmods/lvl3")).gameObject.SetActive(false);
	}

	private void Update()
	{
	}

	private void TryApplyMods(ItemDrop itemInstance)
	{
		ItemData itemData = itemInstance.m_itemData;
		if ((itemData.m_quality == 2 && !persistPastLevel2) || (itemData.m_quality >= 2 && persistPastLevel2))
		{
			((Component)((Component)this).transform.Find("levelmods/lvl2")).gameObject.SetActive(true);
		}
		if ((itemData.m_quality == 3 && !persistPastLevel3) || (itemData.m_quality >= 3 && persistPastLevel3))
		{
			((Component)((Component)this).transform.Find("levelmods/lvl3")).gameObject.SetActive(true);
		}
		if (itemData.m_quality >= 4)
		{
			((Component)((Component)this).transform.Find("levelmods/lvl4")).gameObject.SetActive(true);
		}
	}
}
namespace ValheimHTDArmory
{
	public class SE_Stats_ProgressiveSet : SE_Stats
	{
		private Player player;

		private float bonusModifier = 0f;

		private float timer;

		private float baseTime = 2f;

		private static Dictionary<string, float> allProgressiveSEs = new Dictionary<string, float>();

		private void CrunchNumbers()
		{
			if ((Object)(object)player != (Object)null)
			{
				bonusModifier = 0f;
				ItemData rightItem = ((Humanoid)player).m_rightItem;
				object obj;
				if (rightItem == null)
				{
					obj = null;
				}
				else
				{
					StatusEffect setStatusEffect = rightItem.m_shared.m_setStatusEffect;
					obj = ((setStatusEffect != null) ? ((Object)setStatusEffect).name : null);
				}
				if ((string?)obj == ((Object)this).name)
				{
					DoMathStuff(ref bonusModifier, ((Humanoid)player).m_rightItem);
				}
				ItemData leftItem = ((Humanoid)player).m_leftItem;
				object obj2;
				if (leftItem == null)
				{
					obj2 = null;
				}
				else
				{
					StatusEffect setStatusEffect2 = leftItem.m_shared.m_setStatusEffect;
					obj2 = ((setStatusEffect2 != null) ? ((Object)setStatusEffect2).name : null);
				}
				if ((string?)obj2 == ((Object)this).name)
				{
					DoMathStuff(ref bonusModifier, ((Humanoid)player).m_leftItem);
				}
				ItemData helmetItem = ((Humanoid)player).m_helmetItem;
				object obj3;
				if (helmetItem == null)
				{
					obj3 = null;
				}
				else
				{
					StatusEffect setStatusEffect3 = helmetItem.m_shared.m_setStatusEffect;
					obj3 = ((setStatusEffect3 != null) ? ((Object)setStatusEffect3).name : null);
				}
				if ((string?)obj3 == ((Object)this).name)
				{
					DoMathStuff(ref bonusModifier, ((Humanoid)player).m_helmetItem);
				}
				ItemData chestItem = ((Humanoid)player).m_chestItem;
				object obj4;
				if (chestItem == null)
				{
					obj4 = null;
				}
				else
				{
					StatusEffect setStatusEffect4 = chestItem.m_shared.m_setStatusEffect;
					obj4 = ((setStatusEffect4 != null) ? ((Object)setStatusEffect4).name : null);
				}
				if ((string?)obj4 == ((Object)this).name)
				{
					DoMathStuff(ref bonusModifier, ((Humanoid)player).m_chestItem);
				}
				ItemData legItem = ((Humanoid)player).m_legItem;
				object obj5;
				if (legItem == null)
				{
					obj5 = null;
				}
				else
				{
					StatusEffect setStatusEffect5 = legItem.m_shared.m_setStatusEffect;
					obj5 = ((setStatusEffect5 != null) ? ((Object)setStatusEffect5).name : null);
				}
				if ((string?)obj5 == ((Object)this).name)
				{
					DoMathStuff(ref bonusModifier, ((Humanoid)player).m_legItem);
				}
				ItemData shoulderItem = ((Humanoid)player).m_shoulderItem;
				object obj6;
				if (shoulderItem == null)
				{
					obj6 = null;
				}
				else
				{
					StatusEffect setStatusEffect6 = shoulderItem.m_shared.m_setStatusEffect;
					obj6 = ((setStatusEffect6 != null) ? ((Object)setStatusEffect6).name : null);
				}
				if ((string?)obj6 == ((Object)this).name)
				{
					DoMathStuff(ref bonusModifier, ((Humanoid)player).m_shoulderItem);
				}
				ItemData utilityItem = ((Humanoid)player).m_utilityItem;
				object obj7;
				if (utilityItem == null)
				{
					obj7 = null;
				}
				else
				{
					StatusEffect setStatusEffect7 = utilityItem.m_shared.m_setStatusEffect;
					obj7 = ((setStatusEffect7 != null) ? ((Object)setStatusEffect7).name : null);
				}
				if ((string?)obj7 == ((Object)this).name)
				{
					DoMathStuff(ref bonusModifier, ((Humanoid)player).m_utilityItem);
				}
				if ((Object)(object)player == (Object)(object)Player.m_localPlayer)
				{
					allProgressiveSEs[((Object)this).name] = bonusModifier;
				}
			}
		}

		private void DoMathStuff(ref float mainValue, ItemData id)
		{
			mainValue += (float)(id.m_quality - 1) / (float)id.m_shared.m_maxQuality / (float)id.m_shared.m_setSize;
		}

		public override void Setup(Character character)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			((SE_Stats)this).Setup(character);
			if (character is Player)
			{
				ZNetView component = ((Component)character).gameObject.GetComponent<ZNetView>();
				if ((Object)(object)component != (Object)null)
				{
					player = (Player)character;
					CrunchNumbers();
				}
			}
		}

		public override void UpdateStatusEffect(float dt)
		{
			((SE_Stats)this).UpdateStatusEffect(dt);
			if (timer > 0f)
			{
				timer -= dt;
				return;
			}
			timer = baseTime;
			CrunchNumbers();
		}

		public override void ModifyAttack(SkillType skill, ref HitData hitData)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Invalid comparison between Unknown and I4
			if (skill == base.m_modifyAttackSkill || (int)base.m_modifyAttackSkill == 999)
			{
				float num = (base.m_damageModifier - 1f) * (1f + bonusModifier);
				((DamageTypes)(ref hitData.m_damage)).Modify(1f + num);
			}
		}

		public override string GetTooltipString()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Invalid comparison between Unknown and I4
			if (base.m_damageModifier != 1f && (int)base.m_modifyAttackSkill > 0)
			{
				float num = (allProgressiveSEs.ContainsKey(((Object)this).name) ? allProgressiveSEs[((Object)this).name] : 0f);
				float num2 = (base.m_damageModifier - 1f) * (1f + num);
				StringBuilder stringBuilder = new StringBuilder(256);
				stringBuilder.Append(((SE_Stats)this).GetTooltipString());
				stringBuilder.AppendFormat("$inventory_damage: <color=orange>{0}%</color>\n", (num2 * 100f).ToString("+0;-0"));
				return stringBuilder.ToString();
			}
			return ((SE_Stats)this).GetTooltipString();
		}

		public override void Stop()
		{
			((StatusEffect)this).Stop();
			if ((Object)(object)player == (Object)(object)Player.m_localPlayer && allProgressiveSEs.ContainsKey(((Object)this).name))
			{
				allProgressiveSEs.Remove(((Object)this).name);
			}
		}
	}
	internal class AudioManager
	{
		public enum AudioType
		{
			ZSFX,
			AudioSource
		}

		private class PendingAudioTask
		{
			public GameObject myPrefab;

			private List<AudioTask> targets = new List<AudioTask>();
		}

		private class AudioTask
		{
			private string myNode;

			private bool copyTargetToMe = false;

			private AudioType type;

			private List<AudioTarget> targets = new List<AudioTarget>();

			public void ApplyTask(GameObject go)
			{
				if (targets.Count <= 0)
				{
					return;
				}
				Transform val = RecursiveSearchFunctions.ChildNodeFinderDepthFirst(go.transform, myNode);
				List<AudioClip> list = new List<AudioClip>();
				if (!((Object)(object)val != (Object)null))
				{
					return;
				}
				foreach (AudioTarget target in targets)
				{
					switch (type)
					{
					case AudioType.ZSFX:
					{
						ZSFX component = ((Component)val).GetComponent<ZSFX>();
						if (!((Object)(object)component != (Object)null) || !((Object)(object)val != (Object)null))
						{
							break;
						}
						ZSFX component2 = ((Component)val).GetComponent<ZSFX>();
						if ((Object)(object)component2 != (Object)null && target.targetIndex == -1)
						{
							AudioClip[] audioClips = component2.m_audioClips;
							foreach (AudioClip item in audioClips)
							{
								list.Add(item);
							}
						}
						break;
					}
					}
				}
			}
		}

		private class AudioTarget
		{
			public string targetPrefab;

			public string targetNode;

			public int targetIndex = -1;
		}

		private List<PendingAudioTask> pendingAudioTasks = new List<PendingAudioTask>();
	}
	internal class BiomePlacer : MonoBehaviour
	{
		private void Awake()
		{
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			Terrain[] componentsInChildren = ((Component)this).GetComponentsInChildren<Terrain>(true);
			if (componentsInChildren == null || componentsInChildren.Length == 0)
			{
				return;
			}
			Terrain[] array = componentsInChildren;
			foreach (Terrain val in array)
			{
				TerrainData val2 = Object.Instantiate<TerrainData>(val.terrainData);
				Terrain val3 = Object.Instantiate<Terrain>(val);
				val2.treeInstances = (TreeInstance[])(object)new TreeInstance[0];
				val2.treePrototypes = (TreePrototype[])(object)new TreePrototype[0];
				val3.terrainData = val2;
				((Component)val3).gameObject.SetActive(true);
				TerrainCollider component = ((Component)((Component)val3).transform).GetComponent<TerrainCollider>();
				if ((Object)(object)component != (Object)null)
				{
					component.terrainData = val2;
				}
				TreeInstance[] treeInstances = val.terrainData.treeInstances;
				TreePrototype[] treePrototypes = val.terrainData.treePrototypes;
				if (treeInstances.Length != 0)
				{
					TreeInstance[] array2 = treeInstances;
					foreach (TreeInstance val4 in array2)
					{
						Vector3 val5 = new Vector3(val4.position.x * val.terrainData.size.x, val4.position.y * val.terrainData.size.y, val4.position.z * val.terrainData.size.z) + ((Component)val).transform.position;
						Quaternion val6 = Quaternion.Euler(0f, Random.Range(0f, 360f), 0f);
						GameObject val7 = Object.Instantiate<GameObject>(treePrototypes[val4.prototypeIndex].prefab, val5, val6);
						val7.transform.localScale = new Vector3(val4.widthScale, val4.heightScale, val4.widthScale);
					}
				}
			}
			Object.DestroyImmediate((Object)(object)((Component)this).gameObject);
		}
	}
	public static class MaterialScraper
	{
		private class MaterialTarget
		{
			private int stringIdHash = 0;

			public string targetPrefabName;

			public string targetMaterialChild;

			public int GetIdHash()
			{
				return stringIdHash;
			}

			public MaterialTarget(string stringId, string targetPrefab, string childName)
			{
				stringIdHash = StringExtensionMethods.GetStableHashCode(stringId);
				targetPrefabName = targetPrefab;
				targetMaterialChild = childName;
			}

			public bool IsTargetPrefab(string prefabName)
			{
				return targetPrefabName == prefabName;
			}
		}

		public static string boarTexture = "boarskintexture";

		public static string boarHTDTexture = "boarskintexturehtd";

		public static string boarHTDTextureTS = "boarskintexturehtdtwosided";

		public static string boarTusk = "boartusk";

		private static List<MaterialTarget> targets = new List<MaterialTarget>();

		public static void Init()
		{
			targets.Add(new MaterialTarget(boarTexture, "Boar", "Poly Art Boar"));
			targets.Add(new MaterialTarget(boarTusk, "Boar", "Fangs 004"));
		}

		public static void ScrapeParticleMaterials(GameObject go)
		{
			if (go.transform.childCount <= 0)
			{
				return;
			}
			for (int i = 0; i < go.transform.childCount; i++)
			{
				Transform child = go.transform.GetChild(i);
				ParticleSystemRenderer[] array = ((child != null) ? ((Component)child).GetComponentsInChildren<ParticleSystemRenderer>(true) : null);
				if (array == null || array.Length == 0)
				{
					continue;
				}
				ParticleSystemRenderer[] array2 = array;
				foreach (ParticleSystemRenderer val in array2)
				{
					if (((Renderer)val).sharedMaterials != null)
					{
						Material[] sharedMaterials = ((Renderer)val).sharedMaterials;
						foreach (Material val2 in sharedMaterials)
						{
							if ((Object)(object)val2 != (Object)null)
							{
								MyReferences.SetStoredMaterial(((Object)val2).name, val2);
								MyReferences.SetStoredShader(((Object)val2.shader).name, val2.shader);
							}
						}
					}
					if ((Object)(object)val.trailMaterial != (Object)null)
					{
						MyReferences.SetStoredMaterial(((Object)val.trailMaterial).name, val.trailMaterial);
						MyReferences.SetStoredShader(((Object)val.trailMaterial.shader).name, val.trailMaterial.shader);
					}
				}
			}
		}

		public static void ScrapeTargetMaterials(GameObject go)
		{
			if (targets.Count <= 0)
			{
				return;
			}
			foreach (MaterialTarget target in targets)
			{
				if (target.IsTargetPrefab(((Object)go).name))
				{
					Transform val = RecursiveSearchFunctions.ChildNodeFinderDepthFirst(go.transform, ref target.targetMaterialChild);
					if ((Object)(object)val != (Object)null)
					{
						Renderer component = ((Component)val).GetComponent<Renderer>();
						MyReferences.SetStoredMaterial(target.GetIdHash(), component.sharedMaterial);
					}
				}
			}
		}

		public static void ScrapRendererMaterials(GameObject go)
		{
			Renderer[] componentsInChildren = go.GetComponentsInChildren<Renderer>(true);
			if (componentsInChildren == null || componentsInChildren.Length == 0)
			{
				return;
			}
			Renderer[] array = componentsInChildren;
			foreach (Renderer val in array)
			{
				if (val.sharedMaterials == null)
				{
					continue;
				}
				Material[] sharedMaterials = val.sharedMaterials;
				foreach (Material val2 in sharedMaterials)
				{
					if ((Object)(object)val2 != (Object)null)
					{
						MyReferences.SetStoredMaterial(((Object)val2).name, val2);
						MyReferences.SetStoredShader(((Object)val2.shader).name, val2.shader);
					}
				}
			}
		}

		public static void ScrapeItemRelatedMaterials(GameObject go)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Invalid comparison between Unknown and I4
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Invalid comparison between Unknown and I4
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Invalid comparison between Unknown and I4
			ItemDrop component = go.GetComponent<ItemDrop>();
			if (!((Object)(object)component != (Object)null))
			{
				return;
			}
			ParticleSystemRenderer component2 = go.GetComponent<ParticleSystemRenderer>();
			if ((Object)(object)component2 != (Object)null)
			{
				MyReferences.SetStoredMaterial("item_particle", ((Renderer)component2).sharedMaterial);
			}
			SharedData shared = component.m_itemData.m_shared;
			if ((int)shared.m_itemType == 3 || (int)shared.m_itemType == 14 || (int)shared.m_itemType == 4)
			{
				if (!MyReferences.listOfMaterials.ContainsKey(StringExtensionMethods.GetStableHashCode("club_trail")))
				{
					Transform val = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(go.transform, "attach");
					if ((Object)(object)val != (Object)null)
					{
						val = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(val, "equiped");
						if ((Object)(object)val != (Object)null)
						{
							Transform val2 = RecursiveSearchFunctions.ChildNodeFinderDepthFirst(val, "trail");
							if ((Object)(object)val2 != (Object)null)
							{
								MeleeWeaponTrail component3 = ((Component)val2).gameObject.GetComponent<MeleeWeaponTrail>();
								if ((Object)(object)component3 != (Object)null)
								{
									MyReferences.SetStoredMaterial("club_trail", component3._material);
								}
							}
						}
					}
				}
				MyReferences.TryExtractEffectsFromItemDropShared(shared);
			}
			ScrapePieceMaterials(shared);
		}

		public static void ScrapePieceMaterials(SharedData shared)
		{
			if (shared == null || !((Object)(object)shared.m_buildPieces != (Object)null) || shared.m_buildPieces.m_pieces == null)
			{
				return;
			}
			List<GameObject> pieces = shared.m_buildPieces.m_pieces;
			if (pieces == null)
			{
				return;
			}
			foreach (GameObject item in pieces)
			{
				if (!((Object)(object)item == (Object)null) && ((Object)item).name != null)
				{
					Incinerator component = item.GetComponent<Incinerator>();
					if ((Object)(object)component != (Object)null && (Object)(object)component.m_lightingAOEs != (Object)null)
					{
						ScrapeParticleMaterials(component.m_lightingAOEs);
					}
					MyReferences.SetStoredPiecePrefab(((Object)item).name, item);
					StationExtension component2 = item.GetComponent<StationExtension>();
					if ((Object)(object)component2 != (Object)null && (Object)(object)component2.m_connectionPrefab != (Object)null)
					{
						MyReferences.SetStoredEffectPrefab(((Object)component2.m_connectionPrefab).name, component2.m_connectionPrefab);
					}
					CraftingStation component3 = item.GetComponent<CraftingStation>();
					if ((Object)(object)component3 != (Object)null && !MyReferences.listOfCraftingStations.ContainsKey(StringExtensionMethods.GetStableHashCode(((Object)item).name)))
					{
						MyReferences.listOfCraftingStations.Add(StringExtensionMethods.GetStableHashCode(((Object)item).name), component3);
					}
					CookingStation component4 = item.GetComponent<CookingStation>();
					if ((Object)(object)component4 != (Object)null && !MyReferences.listOfCookingStations.ContainsKey(StringExtensionMethods.GetStableHashCode(((Object)item).name)))
					{
						MyReferences.listOfCookingStations.Add(StringExtensionMethods.GetStableHashCode(((Object)item).name), component4);
					}
					Piece component5 = item.GetComponent<Piece>();
					if ((Object)(object)component5 != (Object)null)
					{
						ExtractEffectsFromPiece(component5.m_placeEffect);
					}
					WearNTear component6 = item.GetComponent<WearNTear>();
					if ((Object)(object)component6 != (Object)null)
					{
						ExtractEffectsFromPiece(component6.m_destroyedEffect);
						ExtractEffectsFromPiece(component6.m_hitEffect);
						ExtractEffectsFromPiece(component6.m_switchEffect);
					}
				}
			}
		}

		private static void ExtractEffectsFromPiece(EffectList el)
		{
			if (el.m_effectPrefabs == null || el.m_effectPrefabs.Length == 0)
			{
				return;
			}
			EffectData[] effectPrefabs = el.m_effectPrefabs;
			foreach (EffectData val in effectPrefabs)
			{
				if ((Object)(object)val.m_prefab != (Object)null)
				{
					MyReferences.SetStoredEffectPrefab(((Object)val.m_prefab).name, val.m_prefab);
				}
			}
		}

		private static void ExtractEffectsFromPiece(EffectList el, string listName)
		{
			try
			{
				if (el.m_effectPrefabs == null || el.m_effectPrefabs.Length == 0)
				{
					return;
				}
				EffectData[] effectPrefabs = el.m_effectPrefabs;
				foreach (EffectData val in effectPrefabs)
				{
					if ((Object)(object)val.m_prefab != (Object)null)
					{
						MyReferences.SetStoredEffectPrefab(((Object)val.m_prefab).name, val.m_prefab);
					}
				}
			}
			catch (Exception ex)
			{
				Plugin.Log.LogError((object)("Error trying to access piece data in list " + listName));
				Plugin.Log.LogError((object)ex.Message);
				Plugin.Log.LogError((object)ex.StackTrace);
			}
		}
	}
	public static class MeshScraper
	{
		private class MeshTarget
		{
			private int stringIdHash = 0;

			public string targetPrefabName;

			public string targetMeshChild;

			public int GetIdHash()
			{
				return stringIdHash;
			}

			public MeshTarget(string stringId, string targetPrefab, string childName)
			{
				stringIdHash = StringExtensionMethods.GetStableHashCode(stringId.ToLower());
				targetPrefabName = targetPrefab;
				targetMeshChild = childName;
			}

			public bool IsTargetPrefab(string prefabName)
			{
				return targetPrefabName == prefabName;
			}
		}

		public static string surtCoreMeshName = "surtcore";

		public static string standMeshName = "standmesh";

		public static string clothesGroundMesh = "clothesground";

		public static string stakeWallMesh = "wallstake";

		public static string woodMesh = "wood";

		private static List<MeshTarget> targets = new List<MeshTarget>();

		public static void Init()
		{
			targets.Add(new MeshTarget(surtCoreMeshName, "SurtlingCore", "core"));
			targets.Add(new MeshTarget(standMeshName, "wood_wall_roof_top", "top"));
			targets.Add(new MeshTarget(clothesGroundMesh, "ArmorRagsChest", "log"));
			targets.Add(new MeshTarget(stakeWallMesh, "stake_wall", "Stake"));
			targets.Add(new MeshTarget(woodMesh, "Wood", "log (1)"));
		}

		public static void CollectMeshes(GameObject go)
		{
			if (targets.Count <= 0)
			{
				return;
			}
			foreach (MeshTarget target in targets)
			{
				if (!target.IsTargetPrefab(((Object)go).name))
				{
					continue;
				}
				GameObject gameObject = ((Component)RecursiveSearchFunctions.ChildNodeFinderDepthFirst(go.transform, target.targetMeshChild)).gameObject;
				if (!((Object)(object)gameObject != (Object)null))
				{
					continue;
				}
				MeshFilter component = gameObject.GetComponent<MeshFilter>();
				if ((Object)(object)component != (Object)null)
				{
					MyReferences.listOfMeshes[target.GetIdHash()] = component.sharedMesh;
					continue;
				}
				SkinnedMeshRenderer component2 = gameObject.GetComponent<SkinnedMeshRenderer>();
				if ((Object)(object)component2 != (Object)null)
				{
					MyReferences.listOfMeshes[target.GetIdHash()] = component2.sharedMesh;
				}
			}
		}
	}
	public class PrefabFixer
	{
		public class NodeData
		{
			public class MaterialTask
			{
				private string materialNameOverride;

				private string materialName;

				private string shaderName;

				private bool useCurrentMaterial = false;

				private bool fixShaderOnly = false;

				private bool mainColorChange = false;

				private Color mainTextureColor;

				private bool emissionColorChange = false;

				private bool emissionColorIsVector = false;

				private Color emissionColor;

				private bool metalColorChange = false;

				private bool metalColorIsVector = false;

				private Color metalColor;

				private int myMaterialIndex = 0;

				private bool metalGlossChange = false;

				private float metalGloss = 0f;

				private bool setTwoSided = false;

				private bool setTwoSidedNormals = false;

				private bool addRain = false;

				public MaterialTask(string materialName)
				{
					this.materialName = materialName;
				}

				public MaterialTask(string materialNameOverride, string materialName)
				{
					this.materialNameOverride = materialNameOverride;
					this.materialName = materialName;
				}

				public MaterialTask UseCurrentMaterial()
				{
					useCurrentMaterial = true;
					return this;
				}

				public MaterialTask SetShader(string shader)
				{
					shaderName = shader;
					return this;
				}

				public MaterialTask SetMainColor(Color col)
				{
					//IL_0002: Unknown result type (might be due to invalid IL or missing references)
					//IL_0003: Unknown result type (might be due to invalid IL or missing references)
					mainTextureColor = col;
					mainColorChange = true;
					return this;
				}

				public MaterialTask SetEmissionColor(Color col, bool isVector = false)
				{
					//IL_0002: Unknown result type (might be due to invalid IL or missing references)
					//IL_0003: Unknown result type (might be due to invalid IL or missing references)
					emissionColor = col;
					emissionColorChange = true;
					emissionColorIsVector = isVector;
					return this;
				}

				public MaterialTask SetMetalColor(Color col, bool isVector = false)
				{
					//IL_0002: Unknown result type (might be due to invalid IL or missing references)
					//IL_0003: Unknown result type (might be due to invalid IL or missing references)
					metalColor = col;
					metalColorChange = true;
					metalColorIsVector = isVector;
					return this;
				}

				public MaterialTask SetMetalGloss(float value)
				{
					metalGloss = value;
					metalGlossChange = true;
					return this;
				}

				public MaterialTask SetMaterialIndex(int index)
				{
					myMaterialIndex = index;
					return this;
				}

				public MaterialTask FixShaderOnly()
				{
					fixShaderOnly = true;
					return this;
				}

				private void ApplyColor(ref Material mat, string field, Color col, bool isVector)
				{
					//IL_0032: 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_0010: Unknown result type (might be due to invalid IL or missing references)
					//IL_0016: Unknown result type (might be due to invalid IL or missing references)
					//IL_001c: 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)
					if (isVector)
					{
						mat.SetVector(field, new Vector4(col.r, col.g, col.b, col.a));
					}
					else
					{
						mat.SetColor(field, col);
					}
				}

				public MaterialTask SetTwoSided(bool normals = false)
				{
					setTwoSided = true;
					setTwoSidedNormals = normals;
					return this;
				}

				public MaterialTask AddRain()
				{
					addRain = true;
					return this;
				}

				private void ApplyTwoSided(ref Material mat)
				{
					if (setTwoSided)
					{
						mat.SetFloat("_Cull", 0f);
					}
					if (setTwoSidedNormals)
					{
						mat.SetFloat("_TwoSidedNormals", 1f);
					}
				}

				public void TryApplyTask(Transform child)
				{
					//IL_008a: Unknown result type (might be due to invalid IL or missing references)
					//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
					//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
					//IL_0222: Unknown result type (might be due to invalid IL or missing references)
					//IL_0229: Expected O, but got Unknown
					//IL_0281: Unknown result type (might be due to invalid IL or missing references)
					//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
					//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
					bool flag = false;
					Material val = null;
					if (shaderName != null && fixShaderOnly)
					{
						Renderer component = ((Component)child).GetComponent<Renderer>();
						if (!((Object)(object)component == (Object)null) || !((Object)(object)component.sharedMaterial == (Object)null))
						{
							val = component.sharedMaterial;
							Shader storedShader = MyReferences.GetStoredShader(shaderName);
							if ((Object)(object)storedShader != (Object)null)
							{
								val.shader = storedShader;
							}
							if (mainColorChange)
							{
								val.SetColor("_Color", mainTextureColor);
							}
							if (emissionColorChange)
							{
								ApplyColor(ref val, "_EmissionColor", emissionColor, emissionColorIsVector);
							}
							if (metalColorChange)
							{
								ApplyColor(ref val, "_MetalColor", metalColor, metalColorIsVector);
								val.SetFloat("_Metallic", 1f);
								val.SetFloat("_UseGlossmap", 1f);
							}
							if (metalGlossChange)
							{
								val.SetFloat("_MetalGloss", metalGloss);
							}
							ApplyTwoSided(ref val);
							if (addRain)
							{
								val.SetFloat("_AddRain", 1f);
							}
							component.sharedMaterial = val;
						}
						return;
					}
					if (materialNameOverride != null)
					{
						val = MyReferences.GetStoredMaterial(materialNameOverride);
						if ((Object)(object)val != (Object)null)
						{
							flag = true;
						}
					}
					if ((Object)(object)val == (Object)null && materialName != null && !useCurrentMaterial)
					{
						val = MyReferences.GetStoredMaterial(materialName);
					}
					Renderer component2 = ((Component)child).GetComponent<Renderer>();
					if ((Object)(object)component2 != (Object)null && (Object)(object)val == (Object)null && useCurrentMaterial)
					{
						val = component2.sharedMaterials[myMaterialIndex];
					}
					else if ((Object)(object)val == (Object)null)
					{
						return;
					}
					if (!flag && materialNameOverride != null && !fixShaderOnly)
					{
						Material mat = new Material(val);
						((Object)mat).name = materialNameOverride;
						if (shaderName != null)
						{
							Shader storedShader2 = MyReferences.GetStoredShader(shaderName);
							if ((Object)(object)storedShader2 != (Object)null)
							{
								mat.shader = storedShader2;
							}
						}
						if (mainColorChange)
						{
							mat.SetColor("_Color", mainTextureColor);
						}
						if (emissionColorChange)
						{
							ApplyColor(ref mat, "_EmissionColor", emissionColor, emissionColorIsVector);
						}
						if (metalColorChange)
						{
							ApplyColor(ref mat, "_MetalColor", metalColor, metalColorIsVector);
							mat.SetFloat("_Metallic", 1f);
							mat.SetFloat("_UseGlossmap", 1f);
						}
						if (metalGlossChange)
						{
							mat.SetFloat("_MetalGloss", metalGloss);
						}
						ApplyTwoSided(ref mat);
						if (addRain)
						{
							mat.SetFloat("_AddRain", 1f);
						}
						MyReferences.SetNewStoredMaterial(materialNameOverride, mat);
						val = mat;
					}
					if (useCurrentMaterial && materialName != null)
					{
						Material storedMaterial = MyReferences.GetStoredMaterial(materialName);
						if ((Object)(object)storedMaterial != (Object)null)
						{
							val.SetTexture("_MainTex", storedMaterial.GetTexture("_MainTex"));
							val.SetTexture("_MetallicGlossMap", storedMaterial.GetTexture("_MetallicGlossMap"));
							val.SetTexture("_BumpMap", storedMaterial.GetTexture("_BumpMap"));
							if (shaderName != null)
							{
								Shader storedShader3 = MyReferences.GetStoredShader(shaderName);
								if ((Object)(object)storedShader3 != (Object)null)
								{
									val.shader = storedShader3;
								}
							}
						}
					}
					if ((Object)(object)component2 != (Object)null)
					{
						Material[] sharedMaterials = component2.sharedMaterials;
						if (sharedMaterials.Length != 0 && myMaterialIndex < sharedMaterials.Length)
						{
							sharedMaterials[myMaterialIndex] = val;
						}
						component2.sharedMaterials = sharedMaterials;
					}
				}
			}

			public class ParticleTask
			{
				private string materialNameOverride;

				private string materialName;

				private string shaderName;

				private bool setTrailMat = false;

				public ParticleTask(string materialName)
				{
					this.materialName = materialName;
				}

				public ParticleTask(string materialNameOverride, string materialName)
				{
					this.materialNameOverride = materialNameOverride;
					this.materialName = materialName;
				}

				public void SetShader(string shader)
				{
					shaderName = shader;
				}

				public void SetTrail()
				{
					setTrailMat = true;
				}

				public void TryApplyTask(Transform child)
				{
					//IL_009c: Unknown result type (might be due to invalid IL or missing references)
					//IL_00a3: Expected O, but got Unknown
					bool flag = false;
					Material val = null;
					if (materialNameOverride != null)
					{
						val = MyReferences.GetStoredMaterial(materialNameOverride);
						flag = true;
					}
					else if (materialName != null)
					{
						val = MyReferences.GetStoredMaterial(materialName);
					}
					if (!((Object)(object)val != (Object)null))
					{
						return;
					}
					if (shaderName != null)
					{
						Shader storedShader = MyReferences.GetStoredShader(shaderName);
						if ((Object)(object)storedShader != (Object)null)
						{
							val.shader = storedShader;
						}
					}
					if (!flag && materialNameOverride != null)
					{
						Material val2 = new Material(val);
						((Object)val2).name = materialNameOverride;
						MyReferences.SetNewStoredMaterial(materialNameOverride.GetHashCode(), val2);
						val = val2;
					}
					ParticleSystemRenderer component = ((Component)child).GetComponent<ParticleSystemRenderer>();
					if ((Object)(object)component != (Object)null)
					{
						if (setTrailMat)
						{
							component.trailMaterial = val;
						}
						else
						{
							((Renderer)component).sharedMaterial = val;
						}
					}
				}
			}

			public class MeshTask
			{
				private string meshName;

				private bool scaleChanged = false;

				private Vector3 scale = Vector3.one;

				public MeshTask(string meshName)
				{
					//IL_0008: Unknown result type (might be due to invalid IL or missing references)
					//IL_000d: Unknown result type (might be due to invalid IL or missing references)
					this.meshName = meshName;
				}

				public MeshTask(string meshName, Vector3 scale)
				{
					//IL_0008: Unknown result type (might be due to invalid IL or missing references)
					//IL_000d: 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_0023: Unknown result type (might be due to invalid IL or missing references)
					this.meshName = meshName;
					this.scale = scale;
					scaleChanged = true;
				}

				public void TryApplyTask(Transform child)
				{
					//IL_008b: Unknown result type (might be due to invalid IL or missing references)
					int stableHashCode = StringExtensionMethods.GetStableHashCode(meshName);
					Mesh val = null;
					if (MyReferences.listOfMeshes.ContainsKey(stableHashCode))
					{
						val = MyReferences.listOfMeshes[stableHashCode];
					}
					if (!((Object)(object)val != (Object)null))
					{
						return;
					}
					MeshFilter component = ((Component)child).GetComponent<MeshFilter>();
					if ((Object)(object)component != (Object)null)
					{
						component.sharedMesh = val;
					}
					else
					{
						SkinnedMeshRenderer component2 = ((Component)child).GetComponent<SkinnedMeshRenderer>();
						if ((Object)(object)component2 != (Object)null)
						{
							component2.sharedMesh = val;
						}
					}
					if (scaleChanged)
					{
						child.localScale = scale;
					}
				}
			}

			private List<Transform> GameObjectChildren = new List<Transform>();

			public int numberOfInstances = 1;

			public string targetChildName;

			private MaterialTask currentMaterialTask;

			private ParticleTask currentParticleTask;

			private MeshTask currentMeshTask;

			private List<MaterialTask> materialTasks = new List<MaterialTask>();

			private List<ParticleTask> particleTasks = new List<ParticleTask>();

			private List<MeshTask> meshTasks = new List<MeshTask>();

			public NodeData(string prefabChild, int instanceCount)
			{
				targetChildName = prefabChild;
				numberOfInstances = instanceCount;
			}

			public void TryFix(GameObject go)
			{
				RecursiveSearchFunctions.ChildNodesFinderDepthFirst(go.transform, ref targetChildName, ref numberOfInstances, ref GameObjectChildren);
				if (GameObjectChildren.Count == 0)
				{
					return;
				}
				if (currentMaterialTask != null)
				{
					materialTasks.Add(currentMaterialTask);
				}
				if (currentParticleTask != null)
				{
					particleTasks.Add(currentParticleTask);
				}
				if (currentMeshTask != null)
				{
					meshTasks.Add(currentMeshTask);
				}
				foreach (Transform gameObjectChild in GameObjectChildren)
				{
					if (materialTasks.Count > 0)
					{
						foreach (MaterialTask materialTask in materialTasks)
						{
							materialTask.TryApplyTask(gameObjectChild);
						}
					}
					if (particleTasks.Count > 0)
					{
						foreach (ParticleTask particleTask in particleTasks)
						{
							particleTask.TryApplyTask(gameObjectChild);
						}
					}
					if (meshTasks.Count <= 0)
					{
						continue;
					}
					foreach (MeshTask meshTask in meshTasks)
					{
						meshTask.TryApplyTask(gameObjectChild);
					}
				}
			}

			public MaterialTask AddMaterialTask(string materialName, bool useCurrentMaterial = false)
			{
				if (currentMaterialTask != null)
				{
					materialTasks.Add(currentMaterialTask);
				}
				currentMaterialTask = new MaterialTask(materialName);
				if (useCurrentMaterial)
				{
					currentMaterialTask.UseCurrentMaterial();
				}
				return currentMaterialTask;
			}

			public MaterialTask AddMaterialTask(string materialNameOverride, string materialName, bool useCurrentMaterial = false)
			{
				if (currentMaterialTask != null)
				{
					materialTasks.Add(currentMaterialTask);
				}
				currentMaterialTask = new MaterialTask(materialNameOverride, materialName);
				if (useCurrentMaterial)
				{
					currentMaterialTask.UseCurrentMaterial();
				}
				return currentMaterialTask;
			}

			public MaterialTask SetMaterialTaskMainColor(Color col)
			{
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				if (currentMaterialTask != null)
				{
					currentMaterialTask.SetMainColor(col);
				}
				return currentMaterialTask;
			}

			public MaterialTask SetMaterialTaskEmissionColor(Color col)
			{
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				if (currentMaterialTask != null)
				{
					currentMaterialTask.SetEmissionColor(col);
				}
				return currentMaterialTask;
			}

			public MaterialTask SetMaterialTaskMetalColor(Color col)
			{
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				if (currentMaterialTask != null)
				{
					currentMaterialTask.SetMetalColor(col);
				}
				return currentMaterialTask;
			}

			public MaterialTask SetMaterialTaskShader(string shader)
			{
				if (currentMaterialTask != null)
				{
					currentMaterialTask.SetShader(shader);
				}
				return currentMaterialTask;
			}

			public ParticleTask AddParticleTask(string materialName, bool setTrail = false)
			{
				if (currentParticleTask != null)
				{
					particleTasks.Add(currentParticleTask);
				}
				currentParticleTask = new ParticleTask(materialName);
				if (setTrail)
				{
					currentParticleTask.SetTrail();
				}
				return currentParticleTask;
			}

			public ParticleTask AddParticleTask(string materialNameOverride, string materialName, bool setTrail = false)
			{
				if (currentParticleTask != null)
				{
					particleTasks.Add(currentParticleTask);
				}
				currentParticleTask = new ParticleTask(materialNameOverride, materialName);
				if (setTrail)
				{
					currentParticleTask.SetTrail();
				}
				return currentParticleTask;
			}

			public ParticleTask SetParticleTaskShader(string shader)
			{
				if (currentParticleTask != null)
				{
					currentParticleTask.SetShader(shader);
				}
				return currentParticleTask;
			}

			public NodeData AddMeshTask(string meshName)
			{
				if (currentMeshTask != null)
				{
					meshTasks.Add(currentMeshTask);
				}
				currentMeshTask = new MeshTask(meshName);
				return this;
			}

			public NodeData AddMeshTask(string meshName, Vector3 scale)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				if (currentMeshTask != null)
				{
					meshTasks.Add(currentMeshTask);
				}
				currentMeshTask = new MeshTask(meshName, scale);
				return this;
			}
		}

		private NodeData currentNode;

		private List<NodeData> nodeData = new List<NodeData>();

		public NodeData Current()
		{
			return currentNode;
		}

		public NodeData New(string childName, int instanceCount = 1)
		{
			if (currentNode != null)
			{
				nodeData.Add(currentNode);
			}
			currentNode = new NodeData(childName, instanceCount);
			return currentNode;
		}

		public void Run(ref GameObject go)
		{
			if (currentNode != null)
			{
				nodeData.Add(currentNode);
				currentNode = null;
			}
			foreach (NodeData nodeDatum in nodeData)
			{
				nodeDatum.TryFix(go);
			}
		}
	}
	internal class CharacterAnimEventPatch
	{
	}
	public class CookingRecipe
	{
		public string fromPrefabName;

		public ItemDrop fromItemDrop;

		public string toPrefabName;

		public ItemDrop toItemDrop;

		public float cookingTime;

		public string cookingStationName;

		public CookingRecipe(string fromPrefabName, string toPrefabName, float cookingTime, string cookingStationName)
		{
			this.fromPrefabName = fromPrefabName;
			this.toPrefabName = toPrefabName;
			this.cookingTime = cookingTime;
			this.cookingStationName = cookingStationName;
		}

		public CookingRecipe(ItemDrop fromItemDrop, ItemDrop toItemDrop, float cookingTime, string cookingStationName)
		{
			this.fromItemDrop = fromItemDrop;
			this.toItemDrop = toItemDrop;
			this.cookingTime = cookingTime;
			this.cookingStationName = cookingStationName;
		}

		public ItemDrop GetFromItemDrop()
		{
			if ((Object)(object)fromItemDrop != (Object)null)
			{
				return fromItemDrop;
			}
			CustomItem? customItem = Plugin.myCustomItems.Where((CustomItem mil) => ((Object)mil.gameObject).name == fromPrefabName).FirstOrDefault();
			ItemDrop val = ((customItem != null) ? customItem.gameObject.GetComponent<ItemDrop>() : null);
			if ((Object)(object)val == (Object)null)
			{
				return MyReferences.listOfAllGameObjects[StringExtensionMethods.GetStableHashCode(fromPrefabName)].GetComponent<ItemDrop>();
			}
			return val;
		}

		public ItemDrop GetToItemDrop()
		{
			if ((Object)(object)toItemDrop != (Object)null)
			{
				return toItemDrop;
			}
			CustomItem? customItem = Plugin.myCustomItems.Where((CustomItem mil) => ((Object)mil.gameObject).name == toPrefabName).FirstOrDefault();
			ItemDrop val = ((customItem != null) ? customItem.gameObject.GetComponent<ItemDrop>() : null);
			if ((Object)(object)val == (Object)null)
			{
				return MyReferences.listOfAllGameObjects[StringExtensionMethods.GetStableHashCode(toPrefabName)].GetComponent<ItemDrop>();
			}
			return val;
		}
	}
	public static class CustomConfigParser
	{
		public static string SerializeObject<T>(T obj)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.AppendLine("Object:" + obj.GetType().Name);
			FieldInfo[] fields = obj.GetType().GetFields();
			FieldInfo[] array = fields;
			foreach (FieldInfo fieldInfo in array)
			{
				stringBuilder.AppendLine($"\t{fieldInfo.Name}: {fieldInfo.GetValue(obj)}");
			}
			return stringBuilder.ToString();
		}
	}
	public class CustomPiece
	{
		public enum EffectListEnum
		{
			PLACEMENT,
			DESTORYED,
			HIT,
			SWITCH
		}

		public GameObject myPiece;

		private bool lookUpToolPrefab = false;

		private string buildToolPrefabName;

		private ItemDrop buildToolID;

		public string craftingStationName;

		public List<string> placeEffectNames = new List<string>();

		public List<string> destoryedEffectNames = new List<string>();

		public List<string> hitEffectNames = new List<string>();

		public List<string> switchEffectNames = new List<string>();

		private List<ResourceElement> craftingResources = new List<ResourceElement>();

		public CustomPiece SetBuildTool(string buildToolPrefabName)
		{
			this.buildToolPrefabName = buildToolPrefabName;
			lookUpToolPrefab = true;
			return this;
		}

		public CustomPiece SetBuildTool(ItemDrop buildToolID)
		{
			this.buildToolID = buildToolID;
			return this;
		}

		public CustomPiece AddEffect(EffectListEnum list, string effectName)
		{
			switch (list)
			{
			case EffectListEnum.PLACEMENT:
				placeEffectNames.Add(effectName);
				break;
			case EffectListEnum.DESTORYED:
				destoryedEffectNames.Add(effectName);
				break;
			case EffectListEnum.HIT:
				hitEffectNames.Add(effectName);
				break;
			case EffectListEnum.SWITCH:
				switchEffectNames.Add(effectName);
				break;
			}
			return this;
		}

		public CustomPiece AddEffect(EffectListEnum list, string[] effectNames)
		{
			switch (list)
			{
			case EffectListEnum.PLACEMENT:
				foreach (string item4 in effectNames)
				{
					placeEffectNames.Add(item4);
				}
				break;
			case EffectListEnum.DESTORYED:
				foreach (string item2 in effectNames)
				{
					destoryedEffectNames.Add(item2);
				}
				break;
			case EffectListEnum.HIT:
				foreach (string item3 in effectNames)
				{
					hitEffectNames.Add(item3);
				}
				break;
			case EffectListEnum.SWITCH:
				foreach (string item in effectNames)
				{
					switchEffectNames.Add(item);
				}
				break;
			}
			return this;
		}

		public CustomPiece AddResourceRequirement(string prefabName, int amount, int amountPerLevel, bool recover = true)
		{
			craftingResources.Add(new ResourceElement(prefabName, amount, amountPerLevel, recover));
			return this;
		}

		public void AddPiece()
		{
			GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(buildToolPrefabName);
			if (!((Object)(object)itemPrefab != (Object)null))
			{
				return;
			}
			ItemDrop component = itemPrefab.GetComponent<ItemDrop>();
			if (!((Object)(object)component != (Object)null))
			{
				return;
			}
			SharedData shared = component.m_itemData.m_shared;
			if ((Object)(object)shared.m_buildPieces != (Object)null)
			{
				shared.m_buildPieces.m_pieces.RemoveAll((GameObject bp) => ((Object)bp).name == ((Object)myPiece).name);
				shared.m_buildPieces.m_pieces.Add(myPiece);
			}
		}

		public void UpdateRequirements()
		{
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Expected O, but got Unknown
			if (craftingResources.Count <= 0)
			{
				return;
			}
			List<Requirement> list = new List<Requirement>();
			GameObject val = null;
			foreach (ResourceElement craftingResource in craftingResources)
			{
				if (MyReferences.listOfItemPrefabs.ContainsKey(StringExtensionMethods.GetStableHashCode(craftingResource.prefabItemName)))
				{
					val = MyReferences.listOfItemPrefabs[StringExtensionMethods.GetStableHashCode(craftingResource.prefabItemName)];
				}
				else
				{
					val = ObjectDB.instance.GetItemPrefab(craftingResource.prefabItemName);
					if ((Object)(object)val != (Object)null && !MyReferences.listOfItemPrefabs.ContainsKey(StringExtensionMethods.GetStableHashCode(craftingResource.prefabItemName)))
					{
						MyReferences.listOfItemPrefabs.Add(StringExtensionMethods.GetStableHashCode(craftingResource.prefabItemName), val);
					}
				}
				list.Add(new Requirement
				{
					m_resItem = val.GetComponent<ItemDrop>(),
					m_amount = craftingResource.amount,
					m_amountPerLevel = craftingResource.amountPerLevel,
					m_recover = craftingResource.recover
				});
				val = null;
			}
			myPiece.GetComponent<Piece>().m_resources = list.ToArray();
		}

		public void CompileAndAddPiece()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Expected O, but got Unknown
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Expected O, but got Unknown
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0245: Expected O, but got Unknown
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Expected O, but got Unknown
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Expected O, but got Unknown
			Piece component = myPiece.GetComponent<Piece>();
			if ((Object)(object)component != (Object)null)
			{
				component.m_craftingStation = MyReferences.listOfCraftingStations[StringExtensionMethods.GetStableHashCode(craftingStationName)];
				if (placeEffectNames != null && placeEffectNames.Count > 0)
				{
					EffectList val = new EffectList();
					List<EffectData> list = new List<EffectData>();
					foreach (string placeEffectName in placeEffectNames)
					{
						EffectData val2 = new EffectData();
						val2.m_prefab = MyReferences.GetStoredEffectPrefab(placeEffectName);
						list.Add(val2);
					}
					val.m_effectPrefabs = list.ToArray();
					component.m_placeEffect = val;
				}
			}
			WearNTear component2 = myPiece.GetComponent<WearNTear>();
			if ((Object)(object)component2 != (Object)null)
			{
				if (destoryedEffectNames != null && destoryedEffectNames.Count > 0)
				{
					EffectList val3 = new EffectList();
					List<EffectData> list2 = new List<EffectData>();
					foreach (string destoryedEffectName in destoryedEffectNames)
					{
						EffectData val4 = new EffectData();
						val4.m_prefab = MyReferences.GetStoredEffectPrefab(destoryedEffectName);
						list2.Add(val4);
					}
					val3.m_effectPrefabs = list2.ToArray();
					component2.m_destroyedEffect = val3;
				}
				if (hitEffectNames != null && hitEffectNames.Count > 0)
				{
					EffectList val5 = new EffectList();
					List<EffectData> list3 = new List<EffectData>();
					foreach (string hitEffectName in hitEffectNames)
					{
						EffectData val6 = new EffectData();
						val6.m_prefab = MyReferences.GetStoredEffectPrefab(hitEffectName);
						list3.Add(val6);
					}
					val5.m_effectPrefabs = list3.ToArray();
					component2.m_hitEffect = val5;
				}
				if (switchEffectNames != null && switchEffectNames.Count > 0)
				{
					EffectList val7 = new EffectList();
					List<EffectData> list4 = new List<EffectData>();
					foreach (string switchEffectName in switchEffectNames)
					{
						EffectData val8 = new EffectData();
						val8.m_prefab = MyReferences.GetStoredEffectPrefab(switchEffectName);
						list4.Add(val8);
					}
					val7.m_effectPrefabs = list4.ToArray();
					component2.m_switchEffect = val7;
				}
			}
			UpdateRequirements();
			AddPiece();
		}
	}
	internal interface ICustomSerializable
	{
		string GetPrettyOutput();
	}
	public static class MyReferences
	{
		public static Dictionary<int, CraftingStation> listOfCraftingStations = new Dictionary<int, CraftingStation>();

		public static Dictionary<int, CookingStation> listOfCookingStations = new Dictionary<int, CookingStation>();

		public static Dictionary<int, StatusEffect> myStatusEffects = new Dictionary<int, StatusEffect>();

		public static List<int> prefabsThatUpgradeAtLevelOneAlways = new List<int>();

		public static Dictionary<int, GameObject> listOfAllGameObjects = new Dictionary<int, GameObject>();

		public static Dictionary<int, GameObject> listOfItemPrefabs = new Dictionary<int, GameObject>();

		public static Dictionary<int, GameObject> listOfPieces = new Dictionary<int, GameObject>();

		public static Dictionary<int, GameObject> listOfEffects = new Dictionary<int, GameObject>();

		public static Dictionary<int, Material> listOfMaterials = new Dictionary<int, Material>();

		public static Dictionary<int, Material> listOfNewMaterials = new Dictionary<int, Material>();

		public static Dictionary<int, Mesh> listOfMeshes = new Dictionary<int, Mesh>();

		public static Dictionary<int, Shader> listOfShaders = new Dictionary<int, Shader>();

		public static Dictionary<int, Attack> myListOfExtraAttacks = new Dictionary<int, Attack>();

		public static void CleanupReferences()
		{
			listOfAllGameObjects = null;
			listOfItemPrefabs = null;
			listOfPieces = null;
			listOfEffects = null;
			listOfMaterials = null;
			listOfNewMaterials = null;
			listOfMeshes = null;
			listOfShaders = null;
		}

		public static GameObject GetStoredEffectPrefab(int hash)
		{
			if (listOfEffects.ContainsKey(hash))
			{
				return listOfEffects[hash];
			}
			return null;
		}

		public static GameObject GetStoredEffectPrefab(string name)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			return GetStoredEffectPrefab(stableHashCode);
		}

		public static void SetStoredEffectPrefab(int hash, GameObject prefab)
		{
			listOfEffects[hash] = prefab;
		}

		public static void SetStoredEffectPrefab(string name, GameObject prefab)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			SetStoredEffectPrefab(stableHashCode, prefab);
		}

		public static Material GetStoredMaterial(int hash)
		{
			if (listOfNewMaterials.ContainsKey(hash))
			{
				return listOfNewMaterials[hash];
			}
			if (listOfMaterials.ContainsKey(hash))
			{
				return listOfMaterials[hash];
			}
			return null;
		}

		public static Material GetStoredMaterial(string name)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			return GetStoredMaterial(stableHashCode);
		}

		public static void SetStoredMaterial(int hash, Material mat)
		{
			listOfMaterials[hash] = mat;
		}

		public static void SetStoredMaterial(string name, Material mat)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			SetStoredMaterial(stableHashCode, mat);
		}

		public static void SetNewStoredMaterial(int hash, Material mat)
		{
			listOfNewMaterials[hash] = mat;
		}

		public static void SetNewStoredMaterial(string name, Material mat)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			SetNewStoredMaterial(stableHashCode, mat);
		}

		public static Shader GetStoredShader(int hash)
		{
			if (listOfShaders.ContainsKey(hash))
			{
				return listOfShaders[hash];
			}
			return null;
		}

		public static Shader GetStoredShader(string name)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			return GetStoredShader(stableHashCode);
		}

		public static void SetStoredShader(string name, Shader shader)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			SetStoredShader(stableHashCode, shader);
		}

		public static void SetStoredShader(int hash, Shader shader)
		{
			listOfShaders[hash] = shader;
		}

		public static void SetStoredGameObjectPrefab(int hash, GameObject go)
		{
			listOfAllGameObjects[hash] = go;
		}

		public static void SetStoredGameObjectPrefab(string name, GameObject go)
		{
			if ((Object)(object)go != (Object)null)
			{
				string text = name.ToLower();
				int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
				SetStoredGameObjectPrefab(stableHashCode, go);
			}
		}

		public static void SetStoredItemPrefab(int hash, GameObject go)
		{
			listOfItemPrefabs[hash] = go;
			SetStoredGameObjectPrefab(hash, go);
		}

		public static void SetStoredItemPrefab(string name, GameObject go)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			SetStoredItemPrefab(stableHashCode, go);
		}

		public static void SetStoredPiecePrefab(int hash, GameObject go)
		{
			listOfPieces[hash] = go;
			SetStoredGameObjectPrefab(hash, go);
		}

		public static void SetStoredPiecePrefab(string name, GameObject go)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			SetStoredPiecePrefab(stableHashCode, go);
		}

		public static void SetStoredAttack(int hash, Attack attack)
		{
			myListOfExtraAttacks[hash] = attack;
		}

		public static void SetStoredAttack(string name, Attack attack)
		{
			string text = name.ToLower();
			int stableHashCode = StringExtensionMethods.GetStableHashCode(text);
			SetStoredAttack(stableHashCode, attack);
		}

		public static void TryAddToStatusEffectList(StatusEffect effect)
		{
			if (!myStatusEffects.ContainsKey(StringExtensionMethods.GetStableHashCode(((Object)effect).name)))
			{
				myStatusEffects.Add(StringExtensionMethods.GetStableHashCode(((Object)effect).name), effect);
			}
		}

		public static void TryExtractEffectsFromItemDropShared(SharedData shared)
		{
			CollectEffectsFromItemDrop(shared.m_hitEffect);
			CollectEffectsFromItemDrop(shared.m_hitTerrainEffect);
			CollectEffectsFromItemDrop(shared.m_holdStartEffect);
			CollectEffectsFromItemDrop(shared.m_startEffect);
			CollectEffectsFromItemDrop(shared.m_triggerEffect);
			CollectEffectsFromItemDrop(shared.m_blockEffect);
			CollectEffectsFromItemDrop(shared.m_trailStartEffect);
		}

		private static void CollectEffectsFromItemDrop(EffectList list)
		{
			if (list == null || list.m_effectPrefabs == null || list.m_effectPrefabs.Length == 0)
			{
				return;
			}
			EffectData[] effectPrefabs = list.m_effectPrefabs;
			foreach (EffectData val in effectPrefabs)
			{
				if (val != null && (Object)(object)val.m_prefab != (Object)null)
				{
					SetStoredEffectPrefab(((Object)val.m_prefab).name, val.m_prefab);
				}
			}
		}
	}
	public class CustomConfig
	{
		[Serializable]
		public class ConfigArmorData
		{
			public string ItemPrefab;

			public bool Enabled = true;

			public int MaxQuality = -1;

			public float Weight = -1f;

			public bool UseDurability = true;

			public float MaxDurability = -1f;

			public float DurabilityPerLevel = -1f;

			public float MovementModifier = -1f;

			public float Armor = -1f;

			public float ArmorPerLevel = -1f;

			public void WriteConfigDataToArmor(ref ItemDrop item)
			{
				SharedData shared = item.m_itemData.m_shared;
				shared.m_maxQuality = ((MaxQuality == -1) ? shared.m_maxQuality : MaxQuality);
				shared.m_weight = ((Weight == -1f) ? shared.m_weight : Weight);
				shared.m_useDurability = UseDurability;
				item.m_itemData.m_durability = ((MaxDurability == -1f) ? shared.m_maxDurability : MaxDurability);
				shared.m_maxDurability = ((MaxDurability == -1f) ? shared.m_maxDurability : MaxDurability);
				shared.m_durabilityPerLevel = ((DurabilityPerLevel == -1f) ? shared.m_durabilityPerLevel : DurabilityPerLevel);
				shared.m_movementModifier = ((MovementModifier == -1f) ? shared.m_movementModifier : MovementModifier);
				shared.m_armor = ((Armor == -1f) ? shared.m_armor : Armor);
				shared.m_armorPerLevel = ((ArmorPerLevel == -1f) ? shared.m_armorPerLevel : ArmorPerLevel);
			}

			public void ReadConfigDataFromArmor(GameObject go)
			{
				SharedData shared = go.GetComponent<ItemDrop>().m_itemData.m_shared;
				ItemPrefab = ((Object)go).name;
				UseDurability = shared.m_useDurability;
				MaxQuality = shared.m_maxQuality;
				Weight = shared.m_weight;
				MaxDurability = shared.m_maxDurability;
				DurabilityPerLevel = shared.m_durabilityPerLevel;
				MovementModifier = shared.m_movementModifier;
				Armor = shared.m_armor;
				ArmorPerLevel = shared.m_armorPerLevel;
			}
		}

		[Serializable]
		public class ConfigItemData
		{
			public string ItemPrefab;

			public bool Enabled = true;

			public int MaxQuality = -1;

			public float Weight = -1f;

			public bool UseDurability = true;

			public float MaxDurability = -1f;

			public float DurabilityPerLevel = -1f;

			public float MovementModifier = -1f;

			public float BlockAmount = -1f;

			public float BlockAmountPerLevel = -1f;

			public float DeflectionForce = -1f;

			public float DeflectionForcePerLevel = -1f;

			public float ParryBonus = -1f;

			public float Knockback_Power = -1f;

			public float Backstab_Bonus = -1f;

			public float DamageBlunt = -1f;

			public float DamageSlash = -1f;

			public float DamagePierce = -1f;

			public float DamageChop = -1f;

			public float DamagePickaxe = -1f;

			public float DamageFire = -1f;

			public float DamageFrost = -1f;

			public float DamageLightning = -1f;

			public float DamagePoison = -1f;

			public float DamageSpirit = -1f;

			public float DamageBluntPerLevel = -1f;

			public float DamageSlashPerLevel = -1f;

			public float DamagePiercePerLevel = -1f;

			public float DamageChopPerLevel = -1f;

			public float DamagePickaxePerLevel = -1f;

			public float DamageFirePerLevel = -1f;

			public float DamageFrostPerLevel = -1f;

			public float DamageLightningPerLevel = -1f;

			public float DamagePoisonPerLevel = -1f;

			public float DamageSpiritPerLevel = -1f;

			public void WriteConfigDataToItem(ref ItemDrop item)
			{
				//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
				//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
				//IL_0204: Unknown result type (might be due to invalid IL or missing references)
				//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
				//IL_0209: Unknown result type (might be due to invalid IL or missing references)
				SharedData shared = item.m_itemData.m_shared;
				shared.m_maxQuality = ((MaxQuality == -1) ? shared.m_maxQuality : MaxQuality);
				shared.m_weight = ((Weight == -1f) ? shared.m_weight : Weight);
				shared.m_useDurability = UseDurability;
				item.m_itemData.m_durability = ((MaxDurability == -1f) ? shared.m_maxDurability : MaxDurability);
				shared.m_maxDurability = ((MaxDurability == -1f) ? shared.m_maxDurability : MaxDurability);
				shared.m_durabilityPerLevel = ((DurabilityPerLevel == -1f) ? shared.m_durabilityPerLevel : DurabilityPerLevel);
				shared.m_movementModifier = ((!Enabled) ? 0f : ((MovementModifier == -1f) ? shared.m_movementModifier : MovementModifier));
				shared.m_blockPower = ((BlockAmount == -1f) ? shared.m_blockPower : BlockAmount);
				shared.m_blockPowerPerLevel = ((BlockAmountPerLevel == -1f) ? shared.m_blockPowerPerLevel : BlockAmountPerLevel);
				shared.m_deflectionForce = ((DeflectionForce == -1f) ? shared.m_deflectionForce : DeflectionForce);
				shared.m_deflectionForcePerLevel = ((DeflectionForcePerLevel == -1f) ? shared.m_deflectionForcePerLevel : DeflectionForcePerLevel);
				shared.m_timedBlockBonus = ((ParryBonus == -1f) ? shared.m_timedBlockBonus : ParryBonus);
				shared.m_attackForce = ((Knockback_Power == -1f) ? shared.m_attackForce : Knockback_Power);
				shared.m_backstabBonus = ((Backstab_Bonus == -1f) ? shared.m_backstabBonus : Backstab_Bonus);
				shared.m_damages = (Enabled ? SetDamageValues() : disabledDamages);
				shared.m_damagesPerLevel = (Enabled ? SetDamagePerLevelValues() : disabledDamages);
			}

			public void ReadConfigDataFromItem(GameObject go)
			{
				//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				SharedData shared = go.GetComponent<ItemDrop>().m_itemData.m_shared;
				ItemPrefab = ((Object)go).name;
				UseDurability = shared.m_useDurability;
				MaxQuality = shared.m_maxQuality;
				Weight = shared.m_weight;
				MaxDurability = shared.m_maxDurability;
				DurabilityPerLevel = shared.m_durabilityPerLevel;
				MovementModifier = shared.m_movementModifier;
				BlockAmount = shared.m_blockPower;
				BlockAmountPerLevel = shared.m_blockPowerPerLevel;
				DeflectionForce = shared.m_deflectionForce;
				DeflectionForcePerLevel = shared.m_deflectionForcePerLevel;
				ParryBonus = shared.m_timedBlockBonus;
				Knockback_Power = shared.m_attackForce;
				Backstab_Bonus = shared.m_backstabBonus;
				GetDamageValues(shared.m_damages);
				GetDamagePerLevelValues(shared.m_damagesPerLevel);
			}

			private DamageTypes SetDamageValues()
			{
				//IL_0003: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: 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_008f: Unknown result type (might be due to invalid IL or missing references)
				DamageTypes result = default(DamageTypes);
				result.m_blunt = DamageBlunt;
				result.m_slash = DamageSlash;
				result.m_pierce = DamagePierce;
				result.m_chop = DamageChop;
				result.m_pickaxe = DamagePickaxe;
				result.m_fire = DamageFire;
				result.m_frost = DamageFrost;
				result.m_lightning = DamageLightning;
				result.m_poison = DamagePoison;
				result.m_spirit = DamageSpirit;
				return result;
			}

			private DamageTypes SetDamagePerLevelValues()
			{
				//IL_0003: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: 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_008f: Unknown result type (might be due to invalid IL or missing references)
				DamageTypes result = default(DamageTypes);
				result.m_blunt = DamageBluntPerLevel;
				result.m_slash = DamageSlashPerLevel;
				result.m_pierce = DamagePiercePerLevel;
				result.m_chop = DamageChopPerLevel;
				result.m_pickaxe = DamagePickaxePerLevel;
				result.m_fire = DamageFirePerLevel;
				result.m_frost = DamageFrostPerLevel;
				result.m_lightning = DamageLightningPerLevel;
				result.m_poison = DamagePoisonPerLevel;
				result.m_spirit = DamageSpiritPerLevel;
				return result;
			}

			private void GetDamageValues(DamageTypes damageList)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: 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_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: 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_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0056: Unknown result type (might be due to invalid IL or missing references)
				//IL_0062: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				DamageBlunt = damageList.m_blunt;
				DamageSlash = damageList.m_slash;
				DamagePierce = damageList.m_pierce;
				DamageChop = damageList.m_chop;
				DamagePickaxe = damageList.m_pickaxe;
				DamageFire = damageList.m_fire;
				DamageFrost = damageList.m_frost;
				DamageLightning = damageList.m_lightning;
				DamagePoison = damageList.m_poison;
				DamageSpirit = damageList.m_spirit;
			}

			private void GetDamagePerLevelValues(DamageTypes damageList)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: 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_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: 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_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0056: Unknown result type (might be due to invalid IL or missing references)
				//IL_0062: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				DamageBluntPerLevel = damageList.m_blunt;
				DamageSlashPerLevel = damageList.m_slash;
				DamagePiercePerLevel = damageList.m_pierce;
				DamageChopPerLevel = damageList.m_chop;
				DamagePickaxePerLevel = damageList.m_pickaxe;
				DamageFirePerLevel = damageList.m_fire;
				DamageFrostPerLevel = damageList.m_frost;
				DamageLightningPerLevel = damageList.m_lightning;
				DamagePoisonPerLevel = damageList.m_poison;
				DamageSpiritPerLevel = damageList.m_spirit;
			}
		}

		[Serializable]
		public class ConfigResource
		{
			public string ItemPrefab;

			public int CraftingCost = 0;

			public int UpgradePerLevelCost = 0;
		}

		[Serializable]
		public class ConfigRecipeData
		{
			public string ItemPrefab;

			public bool Enabled = true;

			public string CraftingStation = "forge";

			public string RepairStation = "forge";

			public int MinimumStationLevel = 1;

			public ConfigResource[] CraftingRequirementsArray;

			public string CraftingRequirements;

			public RecipeHelper LoadConfigedRecipeHelper(GameObject itemToCraft)
			{
				RecipeHelper recipeHelper = new RecipeHelper(itemToCraft, CraftingStation, MinimumStationLevel, 1);
				recipeHelper.recipeEnabled = Enabled;
				ConfigResource[] craftingRequirementsArray = CraftingRequirementsArray;
				foreach (ConfigResource configResource in craftingRequirementsArray)
				{
					recipeHelper.AddResource(configResource.ItemPrefab, configResource.CraftingCost, configResource.UpgradePerLevelCost);
				}
				return recipeHelper;
			}

			public void ReadConfigFromRecipeHelper(RecipeHelper rh)
			{
				ItemPrefab = rh.GetPrefabName();
				CraftingStation = rh.GetCraftingStation();
				RepairStation = rh.GetRepairStation();
				MinimumStationLevel = rh.GetRecipeInstance().m_minStationLevel;
				ResourceElement[] resourceElements = rh.GetResourceElements();
				List<ConfigResource> list = new List<ConfigResource>();
				ResourceElement[] array = resourceElements;
				foreach (ResourceElement resourceElement in array)
				{
					ConfigResource configResource = new ConfigResource();
					configResource.ItemPrefab = resourceElement.prefabItemName;
					configResource.CraftingCost = resourceElement.amount;
					configResource.UpgradePerLevelCost = resourceElement.amountPerLevel;
					list.Add(configResource);
				}
				CraftingRequirementsArray = list.ToArray();
			}
		}

		public List<ConfigItemData> itemConfigs = new List<ConfigItemData>();

		public List<ConfigRecipeData> recipeConfigs = new List<ConfigRecipeData>();

		public List<ConfigArmorData> armorConfigs = new List<ConfigArmorData>();

		private Dictionary<string, ConfigItemData> itemConfigsToApply = new Dictionary<string, ConfigItemData>();

		private Dictionary<string, ConfigRecipeData> recipeConfigsToApply = new Dictionary<string, ConfigRecipeData>();

		private Dictionary<string, ConfigArmorData> armorConfigsToApply = new Dictionary<string, ConfigArmorData>();

		public CustomSyncedValue<string> syncedItemConfigsToApply = new CustomSyncedValue<string>(Plugin.configSync, "itemConfigs");

		public CustomSyncedValue<string> syncedRecipeConfigsToApply = new CustomSyncedValue<string>(Plugin.configSync, "recipeConfigs");

		public CustomSyncedValue<string> syncedArmorConfigsToApply = new CustomSyncedValue<string>(Plugin.configSync, "armorConfigs");

		private bool itemConfigFound = false;

		private bool recipeConfigFound = false;

		private bool armorConfigFound = false;

		private string itemConfigSuffix = "_itemdata";

		private string recipeConfigSuffix = "_recipeData";

		private string armorConfigSuffix = "_armorData";

		private static DamageTypes disabledDamages = default(DamageTypes);

		public CustomConfig()
		{
			syncedItemConfigsToApply.ValueChanged += ItemConfigsChanged;
			syncedRecipeConfigsToApply.ValueChanged += RecipeConfigChanged;
			syncedArmorConfigsToApply.ValueChanged += ArmorConfigChanged;
		}

		private void ItemConfigsChanged()
		{
			itemConfigs.Clear();
			itemConfigsToApply.Clear();
			foreach (ConfigItemData item in DeserializeItemDataConfig(syncedItemConfigsToApply.Value))
			{
				itemConfigs.Add(item);
				if (!itemConfigsToApply.ContainsKey(item.ItemPrefab))
				{
					itemConfigsToApply.Add(item.ItemPrefab, item);
				}
			}
			Plugin.RebuildItems();
		}

		private void RecipeConfigChanged()
		{
			recipeConfigs.Clear();
			recipeConfigsToApply.Clear();
			foreach (ConfigRecipeData item in DeserializeRecipeDataConfig(syncedRecipeConfigsToApply.Value))
			{
				recipeConfigs.Add(item);
				if (!recipeConfigsToApply.ContainsKey(item.ItemPrefab))
				{
					recipeConfigsToApply.Add(item.ItemPrefab, item);
				}
			}
			Plugin.RebuildRecipes();
		}

		private void ArmorConfigChanged()
		{
			armorConfigs.Clear();
			armorConfigsToApply.Clear();
			foreach (ConfigArmorData item in DeserializeArmorDataConfig(syncedArmorConfigsToApply.Value))
			{
				armorConfigs.Add(item);
				if (!armorConfigsToApply.ContainsKey(item.ItemPrefab))
				{
					armorConfigsToApply.Add(item.ItemPrefab, item);
				}
			}
		}

		public void AddItemDataAsConfigRecord(GameObject go)
		{
			ConfigItemData configItemData = new ConfigItemData();
			configItemData.ReadConfigDataFromItem(go);
			itemConfigs.RemoveAll((ConfigItemData ic) => ic.ItemPrefab == ((Object)go).name);
			itemConfigs.Add(configItemData);
		}

		public void ApplyItemDataFromConfigRecord(ref GameObject go)
		{
			if (itemConfigsToApply.Count > 0 && itemConfigsToApply.ContainsKey(((Object)go).name))
			{
				ItemDrop item = go.GetComponent<ItemDrop>();
				itemConfigsToApply[((Object)go).name].WriteConfigDataToItem(ref item);
				itemConfigsToApply.Remove(((Object)go).name);
			}
		}

		public void AddRecipeAsConfigRecord(RecipeHelper rh)
		{
			ConfigRecipeData configRecipeData = new ConfigRecipeData();
			ConfigRecipeData configRecipeData2 = recipeConfigs.Where((ConfigRecipeData rc) => rc.ItemPrefab == rh.GetPrefabName()).FirstOrDefault();
			if (configRecipeData2 != null)
			{
				configRecipeData.Enabled = configRecipeData2.Enabled;
			}
			configRecipeData.ReadConfigFromRecipeHelper(rh);
			recipeConfigs.RemoveAll((ConfigRecipeData rc) => rc.ItemPrefab == rh.GetPrefabName());
			recipeConfigs.Add(configRecipeData);
		}

		public RecipeHelper ApplyRecipeHelperFromConfigRecord(GameObject go)
		{
			if (recipeConfigsToApply.Count > 0 && recipeConfigsToApply.ContainsKey(((Object)go).name))
			{
				RecipeHelper result = recipeConfigsToApply[((Object)go).name].LoadConfigedRecipeHelper(go);
				recipeConfigsToApply.Remove(((Object)go).name);
				return result;
			}
			return null;
		}

		public void AddArmorDataAsConfigRecord(GameObject go)
		{
			ConfigArmorData configArmorData = new ConfigArmorData();
			configArmorData.ReadConfigDataFromArmor(go);
			armorConfigs.RemoveAll((ConfigArmorData ic) => ic.ItemPrefab == ((Object)go).name);
			armorConfigs.Add(configArmorData);
		}

		public void ApplyArmorDataFromConfigRecord(ref GameObject go)
		{
			if (armorConfigsToApply.Count > 0 && armorConfigsToApply.ContainsKey(((Object)go).name))
			{
				ItemDrop item = go.GetComponent<ItemDrop>();
				armorConfigsToApply[((Object)go).name].WriteConfigDataToArmor(ref item);
				armorConfigsToApply.Remove(((Object)go).name);
			}
		}

		public IEnumerable<ConfigItemData> DeserializeItemDataConfig(string data)
		{
			if (data.Trim().Length <= 0)
			{
				yield break;
			}
			data = data.Replace("\t", string.Empty).Replace("\r", string.Empty).Replace("\n", string.Empty);
			string[] splitData = data.Split(new char[1] { '@' });
			if (splitData.Length != 0)
			{
				string[] array = splitData;
				foreach (string itemData in array)
				{
					yield return JsonUtility.FromJson<ConfigItemData>(itemData);
				}
			}
		}

		public IEnumerable<ConfigRecipeData> DeserializeRecipeDataConfig(string data)
		{
			data = data.Replace("\t", string.Empty).Replace("\r", string.Empty).Replace("\n", string.Empty);
			if (data.Trim().Length <= 0)
			{
				yield break;
			}
			string[] splitData = data.Split(new char[1] { '@' });
			if (splitData.Length == 0)
			{
				yield break;
			}
			for (int i = 0; i < splitData.Length; i++)
			{
				string frontHalf2 = splitData[i].Substring(0, splitData[i].IndexOf("\"CraftingRequirements\":"));
				string backHalf3 = splitData[i].Substring(splitData[i].IndexOf("\"CraftingRequirements\":"));
				frontHalf2 += "\"CraftingRequirements\": \"\"}";
				backHalf3 = backHalf3.Substring(backHalf3.IndexOf(":") + 1);
				backHalf3 = backHalf3.Remove(backHalf3.Length - 1);
				ConfigRecipeData itemData = JsonUtility.FromJson<ConfigRecipeData>(frontHalf2);
				string[] splitResourceData = backHalf3.Split(new char[1] { '#' });
				if (splitResourceData.Length != 0)
				{
					List<ConfigResource> res = new List<ConfigResource>();
					for (int j = 0; j < splitResourceData.Length; j++)
					{
						res.Add(JsonUtility.FromJson<ConfigResource>(splitResourceData[j]));
					}
					itemData.CraftingRequirementsArray = res.ToArray();
				}
				yield return itemData;
			}
		}

		public IEnumerable<ConfigArmorData> DeserializeArmorDataConfig(string data)
		{
			if (data.Trim().Length <= 0)
			{
				yield break;
			}
			data = data.Replace("\t", string.Empty).Replace("\r", string.Empty).Replace("\n", string.Empty);
			string[] splitData = data.Split(new char[1] { '@' });
			if (splitData.Length != 0)
			{
				string[] array = splitData;
				foreach (string itemData in array)
				{
					yield return JsonUtility.FromJson<ConfigArmorData>(itemData);
				}
			}
		}

		public void LoadInitialConfigs(string bepinexConfigPath)
		{
			itemConfigFound = Load(itemConfigSuffix, syncedItemConfigsToApply);
			recipeConfigFound = Load(recipeConfigSuffix, syncedRecipeConfigsToApply);
			armorConfigFound = Load(armorConfigSuffix, syncedArmorConfigsToApply);
			bool Load(string fileSuffix, CustomSyncedValue<string> configValue)
			{
				string path = bepinexConfigPath + fileSuffix + ".cfg";
				FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Path.GetDirectoryName(path), Path.GetFileName(path));
				fileSystemWatcher.Changed += consumeConfigFileEvent;
				fileSystemWatcher.Created += consumeConfigFileEvent;
				fileSystemWatcher.Renamed += consumeConfigFileEvent;
				fileSystemWatcher.IncludeSubdirectories = true;
				fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject;
				fileSystemWatcher.EnableRaisingEvents = true;
				return LoadConfig(path, configValue);
				void consumeConfigFileEvent(object sender, FileSystemEventArgs args)
				{
					LoadConfig(path, configValue);
				}
			}
		}

		public bool LoadConfig(string bepinexConfigPath, CustomSyncedValue<string> configValue)
		{
			try
			{
				using StreamReader streamReader = new StreamReader(bepinexConfigPath);
				configValue.AssignLocalValue(streamReader.ReadToEnd());
				return true;
			}
			catch (FileNotFoundException)
			{
				Plugin.Log.LogWarning((object)("Failed to find '" + bepinexConfigPath + "' will create config of same name with default values."));
			}
			catch (IOException ex2)
			{
				Plugin.Log.LogError((object)("An IO Exception was thrown. [" + bepinexConfigPath + "]"));
				Plugin.Log.LogError((object)ex2.Message);
				Plugin.Log.LogError((object)ex2.StackTrace);
			}
			return false;
		}

		public string SerializeItemDataConfig()
		{
			StringBuilder stringBuilder = new StringBuilder();
			foreach (ConfigItemData itemConfig in itemConfigs)
			{
				if (stringBuilder.Length > 0)
				{
					stringBuilder.Append("\r\n@\r\n");
				}
				stringBuilder.Append(JsonUtility.ToJson((object)itemConfig, true));
			}
			return stringBuilder.ToString();
		}

		public string SerializeRecipeDataConfig()
		{
			StringBuilder stringBuilder = new StringBuilder();
			foreach (ConfigRecipeData recipeConfig in recipeConfigs)
			{
				if (stringBuilder.Length > 0)
				{
					stringBuilder.Append("\r\n@\r\n");
				}
				if (recipeConfig.CraftingRequirementsArray.Length != 0)
				{
					bool flag = false;
					ConfigResource[] craftingRequirementsArray = recipeConfig.CraftingRequirementsArray;
					foreach (ConfigResource configResource in craftingRequirementsArray)
					{
						if (flag)
						{
							recipeConfig.CraftingRequirements += "#";
						}
						recipeConfig.CraftingRequirements += JsonUtility.ToJson((object)configResource);
						flag = true;
					}
				}
				string text = JsonUtility.ToJson((object)recipeConfig, true);
				text = text.Replace("\"{", "\r\n\t{\r\n\t\t");
				text = text.Replace("}\"", "\r\n\t}");
				text = text.Replace(",\\\"", ",\r\n\t\t\"");
				text = text.Replace("\\\"", "\"");
				text = text.Replace("}#{", "\r\n\t}\r\n\t#\r\n\t{\r\n\t\t");
				stringBuilder.Append(text);
			}
			return stringBuilder.ToString();
		}

		public string SerializeArmorDataConfig()
		{
			StringBuilder stringBuilder = new StringBuilder();
			foreach (ConfigArmorData armorConfig in armorConfigs)
			{
				if (stringBuilder.Length > 0)
				{
					stringBuilder.Append("\r\n@\r\n");
				}
				stringBuilder.Append(JsonUtility.ToJson((object)armorConfig, true));
			}
			return stringBuilder.ToString();
		}

		public void WriteConfigs(string bepinexConfigPath)
		{
			try
			{
				if (itemConfigs.Count > 0)
				{
					using StreamWriter streamWriter = new StreamWriter(bepinexConfigPath + itemConfigSuffix + ".cfg");
					streamWriter.Write(SerializeItemDataConfig());
				}
			}
			catch (IOException ex)
			{
				Plugin.Log.LogError((object)("An IO Exception was thrown. [" + itemConfigSuffix + "]"));
				Plugin.Log.LogError((object)ex.Message);
				Plugin.Log.LogError((object)ex.StackTrace);
			}
			try
			{
				if (recipeConfigs.Count > 0)
				{
					using StreamWriter streamWriter2 = new StreamWriter(bepinexConfigPath + recipeConfigSuffix + ".cfg");
					streamWriter2.Write(SerializeRecipeDataConfig());
				}
			}
			catch (IOException ex2)
			{
				Plugin.Log.LogError((object)("An IO Exception was thrown. [" + recipeConfigSuffix + "]"));
				Plugin.Log.LogError((object)ex2.Message);
				Plugin.Log.LogError((object)ex2.StackTrace);
			}
			try
			{
				if (armorConfigs.Count > 0)
				{
					using (StreamWriter streamWriter3 = new StreamWriter(bepinexConfigPath + armorConfigSuffix + ".cfg"))
					{
						streamWriter3.Write(SerializeArmorDataConfig());
						return;
					}
				}
			}
			catch (IOException ex3)
			{
				Plugin.Log.LogError((object)("An IO Exception was thrown. [" + armorConfigSuffix + "]"));
				Plugin.Log.LogError((object)ex3.Message);
				Plugin.Log.LogError((object)ex3.StackTrace);
			}
		}
	}
	public class CustomItem
	{
		public GameObject gameObject;

		public EffectsManager effectHandler = new EffectsManager();

		public PrefabFixer prefabFixer = new PrefabFixer();

		public CustomItem(GameObject gameObject)
		{
			this.gameObject = gameObject;
		}

		public void FixReferences()
		{
			effectHandler.ApplyEffects(gameObject);
			prefabFixer.Run(ref gameObject);
		}
	}
	public class CustomLocalization
	{
		private string currentLanguage = "English";

		private string fileSuffix = "_localization";

		private List<string> localizationLines = new List<string>();

		public Dictionary<string, string> localizedWords = new Dictionary<string, string>();

		public bool addedLocalization = false;

		public CustomLocalization()
		{
			string @string = PlayerPrefs.GetString("language", "");
			if (@string != "")
			{
				currentLanguage = @string;
			}
		}

		public void LoadLocalization(string bepinexConfigPath)
		{
			string path = bepinexConfigPath + fileSuffix + ".tsv";
			bool flag = false;
			if (Plugin.useLocalizationInConfigFolder)
			{
				try
				{
					using StreamReader reader = new StreamReader(path);
					ReadLocalization(reader);
					flag = true;
				}
				catch (FileNotFoundException)
				{
					Plugin.Log.LogWarning((object)("Failed to find '" + bepinexConfigPath + fileSuffix + "' will create config of same name with default values."));
				}
				catch (IOException ex2)
				{
					Plugin.Log.LogError((object)("An IO Exception was thrown. [" + fileSuffix + "]"));
					Plugin.Log.LogError((object)ex2.Message);
					Plugin.Log.LogError((object)ex2.StackTrace);
				}
			}
			if (!flag)
			{
				ReadDefaultLocalization();
				if (Plugin.useLocalizationInConfigFolder)
				{
					WriteLocalization(path);
				}
			}
			ParseLocalization();
		}

		private void ParseLocalization()
		{
			int num = -1;
			bool flag = true;
			int num2 = 0;
			foreach (string localizationLine in localizationLines)
			{
				try
				{
					string[] array = localizationLine.Split(new char[1] { '\t' });
					if (flag)
					{
						flag = false;
						for (int i = 1; i < array.Length; i++)
						{
							if (array[i] == currentLanguage)
							{
								num = i;
								break;
							}
						}
					}
					else if (num > -1)
					{
						FilterData(array, num);
					}
					num2++;
				}
				catch (Exception ex)
				{
					Plugin.Log.LogError((object)$"Exception Thrown trying to localize line {num2}: <{localizationLine}>");
					Plugin.Log.LogError((object)("Exception Message: <" + ex.Message + ">"));
				}
			}
		}

		private void FilterData(string[] splitData, int languageIndex)
		{
			string text = splitData[languageIndex];
			if (text.Trim() == string.Empty)
			{
				text = splitData[1];
			}
			localizedWords[splitData[0]] = text;
		}

		private void WriteLocalization(string path)
		{
			StringBuilder stringBuilder = new StringBuilder();
			foreach (string localizationLine in localizationLines)
			{
				stringBuilder.AppendLine(localizationLine);
			}
			using StreamWriter streamWriter = new StreamWriter(path);
			streamWriter.Write(stringBuilder.ToString());
		}

		private void ReadLocalization(StreamReader reader)
		{
			while (!reader.EndOfStream)
			{
				localizationLines.Add(reader.ReadLine());
			}
		}

		private void ReadDefaultLocalization()
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith("localization.tsv"));
			using Stream stream = executingAssembly.GetManifestResourceStream(name);
			using StreamReader streamReader = new StreamReader(stream);
			while (!streamReader.EndOfStream)
			{
				string item = streamReader.ReadLine();
				localizationLines.Add(item);
			}
		}
	}
	public static class ItemManager
	{
		private static AssetBundle assetBundle;

		private static RecipeHelper currentRecipeHelper;

		private static GameObject currentItem;

		private static CustomItem currentCustom;

		private static Color colBlackMetal = new Color(0.3820755f, 1f, 0.3991793f, 1f);

		public static void BuildLists()
		{
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_249f: Unknown result type (might be due to invalid IL or missing references)
			//IL_1e73: Unknown result type (might be due to invalid IL or missing references)
			//IL_1e78: Unknown result type (might be due to invalid IL or missing references)
			//IL_27c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_2b4b: Unknown result type (might be due to invalid IL or missing references)
			//IL_2e6d: Unknown result type (might be due to invalid IL or missing references)
			//IL_32db: Unknown result type (might be due to invalid IL or missing references)
			//IL_3604: Unknown result type (might be due to invalid IL or missing references)
			//IL_435a: Unknown result type (might be due to invalid IL or missing references)
			//IL_45d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_4854: Unknown result type (might be due to invalid IL or missing references)
			//IL_4ad1: Unknown result type (might be due to invalid IL or missing references)
			//IL_4d48: Unknown result type (might be due to invalid IL or missing references)
			//IL_5024: Unknown result type (might be due to invalid IL or missing references)
			//IL_5300: Unknown result type (might be due to invalid IL or missing references)
			//IL_55dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_58b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_5b2f: Unknown result type (might be due to invalid IL or missing references)
			//IL_5da6: Unknown result type (might be due to invalid IL or missing references)
			//IL_601d: Unknown result type (might be due to invalid IL or missing references)
			//IL_6294: Unknown result type (might be due to invalid IL or missing references)
			//IL_6570: Unknown result type (might be due to invalid IL or missing references)
			//IL_684c: Unknown result type (might be due to invalid IL or missing references)
			//IL_6b28: Unknown result type (might be due to invalid IL or missing references)
			assetBundle = GetAssetBundleFromResources("twohandedweapons");
			StatusEffect effect = assetBundle.LoadAsset<StatusEffect>("SEUnholyRegenHTD");
			MyReferences.TryAddToStatusEffectList(effect);
			effect = assetBundle.LoadAsset<StatusEffect>("SEBoarBerserkerSetHTD");
			SE_Stats_ProgressiveSet sE_Stats_ProgressiveSet = ScriptableObject.CreateInstance<SE_Stats_ProgressiveSet>();
			((StatusEffect)sE_Stats_ProgressiveSet).m_name = effect.m_name;
			((StatusEffect)sE_Stats_ProgressiveSet).m_icon = effect.m_icon;
			((StatusEffect)sE_Stats_ProgressiveSet).m_tooltip = effect.m_tooltip;
			((SE_Stats)sE_Stats_ProgressiveSet).m_runStaminaDrainModifier = -0.2f;
			((SE_Stats)sE_Stats_ProgressiveSet).m_jumpStaminaUseModifier = -0.2f;
			((SE_Stats)sE_Stats_ProgressiveSet).m_healthRegenMultiplier = 0.5f;
			((SE_Stats)sE_Stats_ProgressiveSet).m_staminaRegenMultiplier = 1.6f;
			((SE_Stats)sE_Stats_ProgressiveSet).m_modifyAttackSkill = (SkillType)999;
			((SE_Stats)sE_Stats_ProgressiveSet).m_damageModifier = 1.15f;
			((SE_Stats)sE_Stats_ProgressiveSet).m_speedModifier = 0.1f;
			((Object)sE_Stats_ProgressiveSet).name = "SEBoarBerserkerSetHTD";
			MyReferences.TryAddToStatusEffectList((StatusEffect)(object)sE_Stats_ProgressiveSet);
			currentItem = ExtractGameObjectFromBundle(assetBundle, "ArmorHelmetBoarHTD");
			ItemDrop component = currentItem.GetComponent<ItemDrop>();
			component.m_itemData.m_shared.m_setStatusEffect = (StatusEffect)(object)sE_Stats_ProgressiveSet;
			currentRecipeHelper = ApplyConfigChangesAndRecipes(ref currentItem);
			if (currentRecipeHelper == null)
			{
				currentRecipeHelper = new RecipeHelper(currentItem, "piece_workbench", 1, 1);
				currentRecipeHelper.AddResource("TrophyBoar", 1, 0).AddResource("LeatherScraps", 6, 3).AddResource("BoneFragments", 12, 6);
			}
			Plugin.customConfigInstance.AddArmorDataAsConfigRecord(currentItem);
			Plugin.customConfigInstance.AddRecipeAsConfigRecord(currentRecipeHelper);
			currentCustom = new CustomItem(currentItem);
			currentCustom.prefabFixer.New("model0", 4).AddMaterialTask("", useCurrentMaterial: true).FixShaderOnly()
				.SetShader("custom/creature");
			currentCustom.prefabFixer.Current().AddMaterialTask(MaterialScraper.boarTusk).SetMaterialIndex(1);
			currentCustom.prefabFixer.Current().AddMaterialTask(MaterialScraper.boarTexture, useCurrentMaterial: true).SetShader("custom/creature")
				.SetMaterialIndex(2);
			Plugin.myCustomItems.Add(currentCustom);
			Plugin.myRecipeHelperList.Add(currentRecipeHelper);
			currentItem = ExtractGameObjectFromBundle(assetBundle, "ArmorChestBoarHTD");
			component = currentItem.GetComponent<ItemDrop>();
			component.m_itemData.m_shared.m_setStatusEffect = (StatusEffect)(object)sE_Stats_ProgressiveSet;
			currentRecipeHelper = ApplyConfigChangesAndRecipes(ref currentItem);
			if (currentRecipeHelper == null)
			{
				currentRecipeHelper = new RecipeHelper(currentItem, "piece_workbench", 1, 1);
				currentRecipeHelper.AddResource("TrophyBoar", 1, 0).AddResource("LeatherScraps", 10, 4).AddResource("BoneFragments", 12, 6);
			}
			Plugin.customConfigInstance.AddArmorDataAsConfigRecord(currentItem);
			Plugin.customConfigInstance.AddRecipeAsConfigRecord(currentRecipeHelper);
			currentCustom = new CustomItem(currentItem);
			currentCustom.prefabFixer.New("model0", 8).AddMaterialTask(MaterialScraper.boarTusk).SetMaterialIndex(1);
			currentCustom.prefabFixer.New("model1", 6).AddMaterialTask(MaterialScraper.boarTusk).SetMaterialIndex(1);
			currentCustom.prefabFixer.New("log").AddMaterialTask("rags");
			currentCustom.prefabFixer.Current().AddMeshTask(MeshScraper.clothesGroundMesh);
			Plugin.myCustomItems.Add(currentCustom);
			Plugin.myRecipeHelperList.Add(currentRecipeHelper);
			currentItem = ExtractGameObjectFromBundle(assetBundle, "ArmorLegsBoarHTD");
			component = currentItem.GetComponent<ItemDrop>();
			component.m_itemData.m_shared.m_setStatusEffect = (StatusEffect)(object)sE_Stats_ProgressiveSet;
			currentRecipeHelper = ApplyConfigChangesAndRecipes(ref currentItem);
			if (currentRecipeHelper == null)
			{
				currentRecipeHelper = new RecipeHelper(currentItem, "piece_workbench", 1, 1);
				currentRecipeHelper.AddResource("TrophyBoar", 1, 0).AddResource("LeatherScraps", 10, 4);
			}
			Plugin.customConfigInstance.AddArmorDataAsConfigRecord(currentItem);
			Plugin.customConfigInstance.AddRecipeAsConfigRecord(currentRecipeHelper);
			currentCustom = new CustomItem(currentItem);
			currentCustom.prefabFixer.New("model0", 4).AddMaterialTask(MaterialScraper.boarTusk).SetMaterialIndex(1);
			currentCustom.prefabFixer.New("model1", 3).AddMaterialTask(MaterialScraper.boarTusk).SetMaterialIndex(1);
			currentCustom.prefabFixer.New("log").AddMaterialTask("rags");
			currentCustom.prefabFixer.Current().AddMeshTask(MeshScraper.clothesGroundMesh);
			Plugin.myCustomItems.Add(currentCustom);
			Plugin.myRecipeHelperList.Add(currentRecipeHelper);
			currentItem = ExtractGameObjectFromBundle(assetBundle, "ArmorShoulderBoarHTD");
			component = currentItem.GetComponent<ItemDrop>();
			component.m_itemData.m_shared.m_setStatusEffect = (StatusEffect)(object)sE_Stats_ProgressiveSet;
			currentRecipeHelper = ApplyConfigChangesAndRecipes(ref currentItem);
			if (currentRecipeHelper == null)
			{
				currentRecipeHelper = new RecipeHelper(currentItem, "piece_workbench", 1, 1);
				currentRecipeHelper.AddResource("TrophyBoar", 1, 0).AddResource("LeatherScraps", 8, 3).AddResource("BoneFragments", 6, 3);
			}
			Plugin.customConfigInstance.AddArmorDataAsConfigRecord(currentItem);
			Plugin.customConfigInstance.AddRecipeAsConfigRecord(currentRecipeHelper);
			currentCustom = new CustomItem(currentItem);
			currentCustom.prefabFixer.New("model0", 4).AddMaterialTask(MaterialScraper.boarTusk).SetMaterialIndex(1);
			currentCustom.prefabFixer.New("log").AddMaterialTask("rags");
			currentCustom.prefabFixer.Current().AddMeshTask(MeshScraper.clothesGroundMesh);
			Plugin.myCustomItems.Add(currentCustom);
			Plugin.myRecipeHelperList.Add(currentRecipeHelper);
			currentItem = ExtractGameObjectFromBundle(assetBundle, "WoodSwordHTD");
			component = currentItem.GetComponent<ItemDrop>();
			currentRecipeHelper = ApplyConfigChangesAndRecipes(ref currentItem);
			if (currentRecipeHelper == null)
			{
				currentRecipeHelper = new RecipeHelper(currentItem, "", 1, 1);
				currentRecipeHelper.AddResource("Wood", 4, 2);
			}
			currentRecipeHelper.SetRepairStation("piece_workbench");
			Plugin.customConfigInstance.AddItemDataAsConfigRecord(currentItem);
			Plugin.customConfigInstance.AddRecipeAsConfigRecord(currentRecipeHelper);
			Plugin.myRecipeHelperList.Add(currentRecipeHelper);
			currentCustom = new CustomItem(currentItem);
			currentCustom.prefabFixer.New("model").AddMeshTask(MeshScraper.woodMesh);
			currentCustom.prefabFixer.Current().AddMaterialTask("wood_item");
			currentCustom.effectHandler.AddEffect("vfx_clubhit", EffectsManager.EffectList.HIT).AddEffect("sfx_club_hit").AddEffect("fx_hit_camshake");
			currentCustom.effectHandler.AddEffect("vfx_clubhit", EffectsManager.EffectList.HIT_TERRAIN).AddEffect("sfx_club_hit").AddEffect("fx_hit_camshake");
			currentCustom.effectHandler.AddEffect("sfx_wood_blocked", EffectsManager.EffectList.BLOCK).AddEffect("vfx_blocked").AddEffect("fx_block_camshake");
			currentCustom.effectHandler.AddEffect("fx_swing_camshake", EffectsManager.EffectList.TRIGGER);
			currentCustom.effectHandler.AddEffect("sfx_club_swing", EffectsManager.EffectList.TRAIL);
			Plugin.myCustomItems.Add(currentCustom);
			currentItem = ExtractGameObjectFromBundle(assetBundle, "WoodPolearmHTD");
			component = currentItem.GetComponent<ItemDrop>();
			currentRecipeHelper = ApplyConfigChangesAndRecipes(ref currentItem);
			if (currentRecipeHelper == null)
			{
				currentRecipeHelper = new RecipeHelper(currentItem, "", 1, 1);
				currentRecipeHelper.AddResource("Wood", 6, 2);
			}
			currentRecipeHelper.SetRepairStation("piece_workbench");
			Plugin.customConfigInstance.AddItemDataAsConfigRecord(currentItem);
			Plugin.customConfigInstance.AddRecipeAsConfigRecord(currentRecipeHelper);
			Plugin.myRecipeHelperList.Add(currentRecipeHelper);
			currentCustom = new CustomItem(currentItem);
			currentCustom.prefabFixer.New("model").AddMeshTask(MeshScraper.stakeWallMesh);
			currentCustom.prefabFixer.Current().AddMaterialTask("stake");
			currentCustom.effectHandler.AddEffect("vfx_clubhit", EffectsManager.EffectList.HIT).AddEffect("sfx_club_hit").AddEffect("fx_hit_camshake");
			currentCustom.effectHandler.AddEffect("vfx_clubhit", EffectsManager.EffectList.HIT_TERRAIN).AddEffect("sfx_club_hit").AddEffect("fx_hit_camshake");
			currentCustom.effectHandler.AddEffect("sfx_wood_blocked", EffectsManager.EffectList.BLOCK).AddEffect("vfx_blocked").AddEffect("fx_block_camshake");
			currentCustom.effectHandler.AddEffect("fx_swing_camshake", EffectsManager.EffectList.TRIGGER);
			currentCustom.effectHandler.AddEffect("sfx_club_swing", EffectsManager.EffectList.TRAIL);
			Plugin.myCustomItems.Add(currentCustom);
			currentItem = ExtractGameObjectFromBundle(assetBundle, "LeatherFistsHTD");
			component = currentItem.GetComponent<ItemDrop>();
			currentRecipeHelper = ApplyConfigChangesAndRecipes(ref currentItem);
			if (currentRecipeHelper == null)
			{
				currentRecipeHelper = new RecipeHelper(currentItem, "piece_workbench", 1, 1);
				currentRecipeHelper.AddResource("LeatherScraps", 4, 2);
			}
			Plugin.customConfigInstance.AddItemDataAsConfigRecord(currentItem);
			Plugin.customConfigInstance.AddRecipeAsConfigRecord(currentRecipeHelper);
			Plugin.myRecipeHelperList.Add(currentRecipeHelper);
			currentCustom = new CustomItem(currentItem);
			currentCustom.prefabFixer.New("LeatherFists").AddMaterialTask("", useCurrentMaterial: true).FixShaderOnly()
				.SetShader("custom/creature");
			currentCustom.effectHandler.AddEffect("vfx_clubhit", EffectsManager.EffectList.HIT).AddEffect("sfx_unarmed_hit").AddEffect("fx_hit_camshake");
			currentCustom.effectHandler.AddEffect("vfx_clubhit", EffectsManager.EffectList.HIT_TERRAIN).AddEffect("sfx_unarmed_hit").AddEffect("fx_hit_camshake");
			currentCustom.effectHandler.AddEffect("sfx_unarmed_blocked", EffectsManager.EffectList.BLOCK).AddEffect("vfx_blocked").AddEffect("fx_block_camshake");
			currentCust