Decompiled source of Shapekeys and More v2.4.1

ValheimSkapekeysAndMore.dll

Decompiled 7 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace ValheimSkapekeysAndMore;

public static class HelperMethods
{
	public enum ItemType
	{
		RIGHTHAND,
		RIGHTBACK,
		LEFTHAND,
		LEFTBACK,
		CHEST,
		LEGS,
		HEAD,
		SHOULDER,
		UTILITY
	}

	public static void TryAttachOther(ref VisEquipment vis, SharedData shared, GameObject go, int variant, int numOfVariants, int level, int maxLevel)
	{
		Transform val = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(go.transform, "attach_other", contains: true);
		if (!((Object)(object)val != (Object)null))
		{
			return;
		}
		GameObject go2 = Object.Instantiate<GameObject>(((Component)val).gameObject);
		Transform val2 = null;
		Transform[] array = null;
		val2 = TryApplyChildStyle(ref go2, variant, numOfVariants);
		if ((Object)(object)val2 != (Object)null)
		{
			GameObject go3 = ((Component)((Component)val2).transform).gameObject;
			array = TryApplyChildLevel(ref go3, level, maxLevel);
			if (array != null)
			{
				Transform[] array2 = array;
				foreach (Transform val3 in array2)
				{
					GameObject __result = ((Component)((Component)val3).transform).gameObject;
					VisEquipment.EnableEquippedEffects(__result);
					ApplySexBasedSettings(vis, ref __result);
				}
			}
			else
			{
				VisEquipment.EnableEquippedEffects(go3);
				ApplySexBasedSettings(vis, ref go3);
			}
		}
		else
		{
			array = TryApplyChildLevel(ref go2, level, maxLevel);
			if (array != null)
			{
				Transform[] array3 = array;
				foreach (Transform val4 in array3)
				{
					GameObject __result2 = ((Component)((Component)val4).transform).gameObject;
					VisEquipment.EnableEquippedEffects(__result2);
					ApplySexBasedSettings(vis, ref __result2);
				}
			}
		}
		go2.SetActive(true);
		VisEquipment.CleanupInstance(go2);
		AttachOther(vis, shared, go2.transform);
	}

	private static void AttachOther(VisEquipment vis, SharedData shared, Transform objectTransform)
	{
		//IL_00cc: 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_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: Invalid comparison between Unknown and I4
		//IL_00e3: 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_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Invalid comparison between Unknown and I4
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: Unknown result type (might be due to invalid IL or missing references)
		//IL_0119: Invalid comparison between Unknown and I4
		//IL_00f0: 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 I4, but got Unknown
		//IL_03a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0232: Unknown result type (might be due to invalid IL or missing references)
		//IL_0328: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c9: 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_0124: Invalid comparison between Unknown and I4
		//IL_0165: Unknown result type (might be due to invalid IL or missing references)
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0351: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Invalid comparison between Unknown and I4
		//IL_040b: Unknown result type (might be due to invalid IL or missing references)
		//IL_03fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_0198: Unknown result type (might be due to invalid IL or missing references)
		//IL_028e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0384: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0309: Unknown result type (might be due to invalid IL or missing references)
		//IL_0213: Unknown result type (might be due to invalid IL or missing references)
		VisEquipmentOther component = ((Component)vis).GetComponent<VisEquipmentOther>();
		if ((Object)(object)component == (Object)null)
		{
			return;
		}
		float result = 0f;
		if (((Object)objectTransform).name.Contains("["))
		{
			string text = ((Object)objectTransform).name.Substring(1 + ((Object)objectTransform).name.IndexOf('['), ((Object)objectTransform).name.IndexOf(']') - ((Object)objectTransform).name.IndexOf('[') - 1);
			if (text[0] == 'R')
			{
				result = ((!float.TryParse(text.Substring(1), out result)) ? 0f : (result * -1f));
			}
			else if (!float.TryParse(text, out result))
			{
				result = 0f;
			}
		}
		ItemType val = shared.m_attachOverride;
		if ((int)val == 0)
		{
			val = shared.m_itemType;
		}
		ItemType val2 = val;
		ItemType val3 = val2;
		if ((int)val3 <= 14)
		{
			switch (val3 - 3)
			{
			default:
				if ((int)val3 != 14)
				{
					break;
				}
				objectTransform.SetParent(component.backTwohandedMeleeOther);
				objectTransform.localRotation = Quaternion.identity;
				if (result != 0f)
				{
					objectTransform.localRotation = Quaternion.Euler(0f, result, 0f);
					if ((Object)(object)vis.m_rightBackItemInstance != (Object)null)
					{
						vis.m_rightBackItemInstance.transform.localRotation = Quaternion.Euler(0f, result, 0f);
					}
				}
				break;
			case 0:
				objectTransform.SetParent(component.backMeleeOther);
				objectTransform.localRotation = Quaternion.identity;
				if (result != 0f)
				{
					objectTransform.localRotation = Quaternion.Euler(0f, result, 0f);
					if ((Object)(object)vis.m_rightBackItemInstance != (Object)null)
					{
						vis.m_rightBackItemInstance.transform.localRotation = Quaternion.Euler(0f, result, 0f);
					}
				}
				break;
			case 1:
				objectTransform.SetParent(component.backBowOther);
				objectTransform.localRotation = Quaternion.identity;
				if (result != 0f)
				{
					objectTransform.localRotation = Quaternion.Euler(0f, result, 0f);
					if ((Object)(object)vis.m_rightBackItemInstance != (Object)null)
					{
						vis.m_rightBackItemInstance.transform.localRotation = Quaternion.Euler(0f, result, 0f);
					}
				}
				break;
			case 2:
				objectTransform.SetParent(component.backShieldOther);
				objectTransform.localRotation = Quaternion.identity;
				if (result != 0f)
				{
					objectTransform.localRotation = Quaternion.Euler(0f, result, 0f);
					if ((Object)(object)vis.m_leftBackItemInstance != (Object)null)
					{
						vis.m_leftBackItemInstance.transform.localRotation = Quaternion.Euler(0f, result, 0f);
					}
				}
				break;
			}
		}
		else if ((int)val3 != 19)
		{
			if ((int)val3 == 20)
			{
				objectTransform.SetParent(component.backAtgeirOther);
				objectTransform.localRotation = Quaternion.identity;
				if (result != 0f)
				{
					objectTransform.localRotation = Quaternion.Euler(0f, result, 0f);
					if ((Object)(object)vis.m_rightBackItemInstance != (Object)null)
					{
						vis.m_rightBackItemInstance.transform.localRotation = Quaternion.Euler(0f, result, 0f);
					}
				}
			}
		}
		else
		{
			objectTransform.SetParent(component.backToolOther);
			objectTransform.localRotation = Quaternion.identity;
			if (result != 0f)
			{
				objectTransform.localRotation = Quaternion.Euler(0f, result, 0f);
				if ((Object)(object)vis.m_rightBackItemInstance != (Object)null)
				{
					vis.m_rightBackItemInstance.transform.localRotation = Quaternion.Euler(0f, result, 0f);
				}
			}
		}
		objectTransform.localPosition = Vector3.zero;
	}

	public static void ClearAttachOthers(ref VisEquipment vs)
	{
		VisEquipmentOther component = ((Component)vs).GetComponent<VisEquipmentOther>();
		if (!((Object)(object)component == (Object)null))
		{
			ClearAttach(component.backAtgeirOther);
			ClearAttach(component.backBowOther);
			ClearAttach(component.backMeleeOther);
			ClearAttach(component.backShieldOther);
			ClearAttach(component.backToolOther);
			ClearAttach(component.backTwohandedMeleeOther);
		}
	}

	private static void ClearAttach(Transform t)
	{
		if ((Object)(object)t != (Object)null)
		{
			while (t.childCount > 0)
			{
				Transform child = t.GetChild(0);
				child.SetParent((Transform)null);
				Object.Destroy((Object)(object)((Component)child).gameObject);
			}
		}
	}

	private static void TryApplyFemaleShapeKey(SkinnedMeshRenderer smr)
	{
		int num = -1;
		Mesh sharedMesh = smr.sharedMesh;
		if (sharedMesh.blendShapeCount <= 0)
		{
			return;
		}
		for (int i = 0; i < sharedMesh.blendShapeCount; i++)
		{
			if (sharedMesh.GetBlendShapeName(i).IndexOf("female", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				num = i;
				break;
			}
		}
		if (num >= 0)
		{
			smr.SetBlendShapeWeight(num, 100f);
		}
	}

	private static void EnableSexBasedChildren(ref GameObject go, bool male, bool female)
	{
		if (go.transform.childCount <= 0)
		{
			return;
		}
		for (int i = 0; i < go.transform.childCount; i++)
		{
			Transform child = go.transform.GetChild(i);
			string name = ((Object)child).name;
			bool flag = name.IndexOf("male", StringComparison.OrdinalIgnoreCase) >= 0 && name.IndexOf("female", StringComparison.OrdinalIgnoreCase) == -1;
			bool flag2 = name.IndexOf("male", StringComparison.OrdinalIgnoreCase) == -1;
			if (male && !flag2)
			{
				if (flag)
				{
					((Component)child).gameObject.SetActive(true);
				}
				else
				{
					((Component)child).gameObject.SetActive(false);
				}
			}
			if (female && !flag2)
			{
				if (!flag)
				{
					((Component)child).gameObject.SetActive(true);
				}
				else
				{
					((Component)child).gameObject.SetActive(false);
				}
			}
		}
	}

	private static void CheckVisEquipmentModelsSex(out bool male, out bool female, PlayerModel[] models, int index)
	{
		switch (models.Length)
		{
		case 2:
			male = index == 0;
			female = index == 1;
			break;
		case 1:
			male = !((Object)models[0].m_mesh).name.Contains("fem");
			female = ((Object)models[0].m_mesh).name.Contains("fem");
			break;
		default:
			male = false;
			female = false;
			break;
		}
	}

	public static void ApplySexBasedSettings(VisEquipment __instance, ref GameObject __result)
	{
		try
		{
			if (!((Object)(object)__result != (Object)null))
			{
				return;
			}
			bool male = false;
			bool female = false;
			if (__instance.m_models != null)
			{
				CheckVisEquipmentModelsSex(out male, out female, __instance.m_models, __instance.m_modelIndex);
			}
			else
			{
				ZNetView component = ((Component)__instance).gameObject.GetComponent<ZNetView>();
				if ((Object)(object)component != (Object)null)
				{
					male = component.GetZDO().GetBool("isMale", false);
					female = component.GetZDO().GetBool("isFemale", false);
				}
			}
			if (female)
			{
				SkinnedMeshRenderer component2 = __result.GetComponent<SkinnedMeshRenderer>();
				if ((Object)(object)component2 != (Object)null && female)
				{
					TryApplyFemaleShapeKey(component2);
				}
				SkinnedMeshRenderer[] componentsInChildren = __result.GetComponentsInChildren<SkinnedMeshRenderer>();
				if (componentsInChildren != null && componentsInChildren.Length != 0)
				{
					for (int i = 0; i < componentsInChildren.Length; i++)
					{
						TryApplyFemaleShapeKey(componentsInChildren[i]);
					}
				}
			}
			EnableSexBasedChildren(ref __result, male, female);
		}
		catch (Exception ex)
		{
			Plugin.Log.LogError((object)"Error in ApplySexBasedSettings, exception handled. Below is the stacktrace.");
			Plugin.Log.LogError((object)ex.StackTrace);
		}
	}

	public static Transform TryApplyChildStyle(ref GameObject go, int variant, int numberOfVariants)
	{
		Transform result = null;
		string text = "style_" + variant;
		List<Transform> nestedTargets = new List<Transform>();
		RecursiveSearchFunctions.ChildNodesFinderBreadthFirst(go.transform, "style_", numberOfVariants, ref nestedTargets, contains: true);
		if (nestedTargets != null && nestedTargets.Count > 0)
		{
			foreach (Transform item in nestedTargets)
			{
				if (((Object)item).name == text)
				{
					GameObject gameObject = ((Component)item).gameObject;
					gameObject.SetActive(true);
					result = gameObject.transform;
				}
				else
				{
					((Component)item).gameObject.SetActive(false);
				}
			}
		}
		return result;
	}

	public static Transform[] TryApplyChildLevel(ref GameObject go, int level, int maxLevel)
	{
		List<Transform> list = new List<Transform>();
		int num = level - 1;
		List<Transform> nestedTargets = new List<Transform>();
		RecursiveSearchFunctions.ChildNodesFinderDepthFirst(go.transform, "level_", ref maxLevel, ref nestedTargets, contains: true);
		if (nestedTargets.Count > 0)
		{
			int num2 = -1;
			List<KeyValuePair<int, Transform>> list2 = new List<KeyValuePair<int, Transform>>();
			for (int num3 = nestedTargets.Count - 1; num3 >= 0; num3--)
			{
				if (((Object)nestedTargets[num3]).name.StartsWith("level_"))
				{
					string[] array = ((Object)nestedTargets[num3]).name.Split(new char[1] { '_' });
					if (array.Length > 1)
					{
						if (array[1].IndexOf('-') > -1)
						{
							string[] array2 = array[1].Split(new char[1] { '-' });
							int num4 = int.Parse(array2[0]);
							int num5 = int.Parse(array2[1]);
							if (num4 > num2)
							{
								num2 = num4;
							}
							if (num5 > num2)
							{
								num2 = num5;
							}
							if (num4 == num2 || num5 == num2)
							{
								list2.Add(new KeyValuePair<int, Transform>(num2, nestedTargets[num3]));
							}
							if (num >= num4 && num <= num5)
							{
								((Component)nestedTargets[num3]).gameObject.SetActive(true);
								list.Add(nestedTargets[num3]);
							}
							else
							{
								((Component)nestedTargets[num3]).gameObject.SetActive(false);
							}
						}
						else
						{
							int num6 = int.Parse(array[1]);
							if (num6 > num2)
							{
								num2 = num6;
							}
							if (num6 == num2)
							{
								list2.Add(new KeyValuePair<int, Transform>(num2, nestedTargets[num3]));
							}
							if (num == num6)
							{
								((Component)nestedTargets[num3]).gameObject.SetActive(true);
								list.Add(nestedTargets[num3]);
							}
							else
							{
								((Component)nestedTargets[num3]).gameObject.SetActive(false);
							}
						}
					}
				}
			}
			if (list2.Count > 0)
			{
				foreach (KeyValuePair<int, Transform> item in list2)
				{
					if (item.Key == num2 && num >= num2)
					{
						if (!list.Contains(item.Value))
						{
							((Component)item.Value).gameObject.SetActive(true);
							list.Add(item.Value);
						}
						else
						{
							((Component)item.Value).gameObject.SetActive(true);
						}
					}
					else
					{
						((Component)item.Value).gameObject.SetActive(false);
					}
				}
			}
		}
		return (list.Count > 0) ? list.ToArray() : null;
	}

	public static void GetItemDataFromHumanoid(Humanoid humanoid, ItemType itemType, out ItemData id, out string zdoKey)
	{
		switch (itemType)
		{
		case ItemType.RIGHTHAND:
			id = humanoid.m_rightItem;
			zdoKey = "RightItem";
			break;
		case ItemType.RIGHTBACK:
			id = humanoid.m_hiddenRightItem;
			zdoKey = "RightBackItem";
			break;
		case ItemType.LEFTHAND:
			id = humanoid.m_leftItem;
			zdoKey = "LeftItem";
			break;
		case ItemType.LEFTBACK:
			id = humanoid.m_hiddenLeftItem;
			zdoKey = "LeftBackItem";
			break;
		case ItemType.CHEST:
			id = humanoid.m_chestItem;
			zdoKey = "ChestItem";
			break;
		case ItemType.HEAD:
			id = humanoid.m_helmetItem;
			zdoKey = "HelmetItem";
			break;
		case ItemType.SHOULDER:
			id = humanoid.m_shoulderItem;
			zdoKey = "ShoulderItem";
			break;
		case ItemType.UTILITY:
			id = humanoid.m_utilityItem;
			zdoKey = "UtilityItem";
			break;
		case ItemType.LEGS:
			id = humanoid.m_legItem;
			zdoKey = "LegItem";
			break;
		default:
			id = null;
			zdoKey = "";
			break;
		}
	}

	public static void SetItemLevelZDO(ZDO zdo, ItemData id, string zdoName)
	{
		if (!string.IsNullOrEmpty(zdoName))
		{
			if (id != null)
			{
				int quality = id.m_quality;
				int maxQuality = id.m_shared.m_maxQuality;
				zdo.Set(zdoName + "LevelHTD", quality);
				zdo.Set(zdoName + "MaxLevelHTD", maxQuality);
			}
			else
			{
				zdo.Set(zdoName + "LevelHTD", 0);
				zdo.Set(zdoName + "MaxLevelHTD", 1);
			}
		}
	}

	public static void SetItemVariantZDO(ZDO zdo, ItemData id, string zdoName, bool isVanilla = false)
	{
		if (!string.IsNullOrEmpty(zdoName))
		{
			if (id != null)
			{
				int variant = id.m_variant;
				int variants = id.m_shared.m_variants;
				zdo.Set(zdoName + "Variant" + (isVanilla ? "" : "HTD"), variant);
				zdo.Set(zdoName + "MaxVariantHTD", variants);
			}
			else
			{
				zdo.Set(zdoName + "Variant" + (isVanilla ? "" : "HTD"), 0);
				zdo.Set(zdoName + "MaxVariantHTD", 1);
			}
		}
	}

	public static bool TryApply(ref VisEquipment vis, ref GameObject obj, int hash, string zdoName, int variant, int maxVariant, int level, int maxLevel, bool vanillaVariant = false)
	{
		bool result = false;
		if ((Object)(object)obj != (Object)null)
		{
			Transform val = null;
			Transform[] array = null;
			Material val2 = null;
			bool flag = zdoName.StartsWith("Chest");
			bool flag2 = zdoName.StartsWith("Leg");
			val = TryApplyChildStyle(ref obj, variant, maxVariant);
			if ((Object)(object)val != (Object)null)
			{
				GameObject go = ((Component)((Component)val).transform).gameObject;
				SkinnedMeshRenderer[] componentsInChildren = go.GetComponentsInChildren<SkinnedMeshRenderer>(true);
				foreach (SkinnedMeshRenderer val3 in componentsInChildren)
				{
					val3.rootBone = vis.m_bodyModel.rootBone;
					val3.bones = vis.m_bodyModel.bones;
				}
				Cloth[] componentsInChildren2 = go.GetComponentsInChildren<Cloth>(true);
				foreach (Cloth val4 in componentsInChildren2)
				{
					if (vis.m_clothColliders.Length != 0 && val4.capsuleColliders.Length < vis.m_clothColliders.Length)
					{
						if (val4.capsuleColliders.Length != 0)
						{
							List<CapsuleCollider> list = new List<CapsuleCollider>(vis.m_clothColliders);
							list.AddRange(val4.capsuleColliders);
							val4.capsuleColliders = list.ToArray();
						}
						else
						{
							val4.capsuleColliders = vis.m_clothColliders;
						}
					}
				}
				array = TryApplyChildLevel(ref go, level, maxLevel);
				if (array != null)
				{
					Transform[] array2 = array;
					foreach (Transform val5 in array2)
					{
						GameObject __result = ((Component)((Component)val5).transform).gameObject;
						VisEquipment.EnableEquippedEffects(__result);
						ApplySexBasedSettings(vis, ref __result);
						VisEquipment.CleanupInstance(__result);
						result = true;
					}
				}
				else
				{
					VisEquipment.EnableEquippedEffects(go);
					ApplySexBasedSettings(vis, ref go);
					VisEquipment.CleanupInstance(go);
					result = true;
				}
			}
			else
			{
				array = TryApplyChildLevel(ref obj, level, maxLevel);
				if (array != null)
				{
					Transform[] array3 = array;
					foreach (Transform val6 in array3)
					{
						GameObject __result2 = ((Component)((Component)val6).transform).gameObject;
						SkinnedMeshRenderer[] componentsInChildren3 = __result2.GetComponentsInChildren<SkinnedMeshRenderer>(true);
						foreach (SkinnedMeshRenderer val7 in componentsInChildren3)
						{
							val7.rootBone = vis.m_bodyModel.rootBone;
							val7.bones = vis.m_bodyModel.bones;
						}
						Cloth[] componentsInChildren4 = __result2.GetComponentsInChildren<Cloth>(true);
						foreach (Cloth val8 in componentsInChildren4)
						{
							if (vis.m_clothColliders.Length != 0 && val8.capsuleColliders.Length < vis.m_clothColliders.Length)
							{
								if (val8.capsuleColliders.Length != 0)
								{
									List<CapsuleCollider> list2 = new List<CapsuleCollider>(vis.m_clothColliders);
									list2.AddRange(val8.capsuleColliders);
									val8.capsuleColliders = list2.ToArray();
								}
								else
								{
									val8.capsuleColliders = vis.m_clothColliders;
								}
							}
						}
						VisEquipment.EnableEquippedEffects(__result2);
						ApplySexBasedSettings(vis, ref __result2);
						result = true;
					}
				}
			}
			if (flag || flag2)
			{
				if (array != null)
				{
					List<Material> list3 = new List<Material>();
					Transform[] array4 = array;
					foreach (Transform target in array4)
					{
						Transform val9 = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(target, "armormat");
						if ((Object)(object)val9 != (Object)null)
						{
							MeshRenderer component = ((Component)val9).gameObject.GetComponent<MeshRenderer>();
							if ((Object)(object)component != (Object)null)
							{
								list3.Add(((Renderer)component).sharedMaterial);
							}
						}
					}
					if (list3.Count > 0)
					{
						val2 = list3[list3.Count - 1];
					}
				}
				else if ((Object)(object)val != (Object)null && (Object)(object)val2 == (Object)null)
				{
					Transform val10 = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(val, "armormat");
					if ((Object)(object)val10 != (Object)null)
					{
						val2 = ((Renderer)((Component)val10).GetComponent<MeshRenderer>()).sharedMaterial;
					}
				}
				if (flag)
				{
					ApplyArmorMat(vis, hash, chest: true, val2);
				}
				if (flag2)
				{
					ApplyArmorMat(vis, hash, chest: false, val2);
				}
			}
		}
		return result;
	}

	public static void ApplyArmorMat(VisEquipment vis, int hash, bool chest, Material armorMat = null)
	{
		int modelIndex = vis.GetModelIndex();
		string text = "";
		if (modelIndex == 1)
		{
			text = "Female";
		}
		Material val = armorMat;
		if ((Object)(object)val == (Object)null)
		{
			GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(hash);
			if ((Object)(object)itemPrefab != (Object)null)
			{
				ItemDrop component = itemPrefab.GetComponent<ItemDrop>();
				if ((Object)(object)component != (Object)null)
				{
					val = component.m_itemData.m_shared.m_armorMaterial;
				}
			}
		}
		if (!((Object)(object)val != (Object)null))
		{
			return;
		}
		if (chest)
		{
			if (val.HasProperty("_ChestTex" + text) && (Object)(object)val.GetTexture("_ChestTex" + text) != (Object)null)
			{
				((Renderer)vis.m_bodyModel).material.SetTexture("_ChestTex", val.GetTexture("_ChestTex" + text));
				((Renderer)vis.m_bodyModel).material.SetTexture("_ChestBumpMap", val.GetTexture("_ChestBumpMap" + text));
				((Renderer)vis.m_bodyModel).material.SetTexture("_ChestMetal", val.GetTexture("_ChestMetal" + text));
			}
			else if (val.HasProperty("_ChestTex") && (Object)(object)val.GetTexture("_ChestTex") != (Object)null)
			{
				((Renderer)vis.m_bodyModel).material.SetTexture("_ChestTex", val.GetTexture("_ChestTex"));
				((Renderer)vis.m_bodyModel).material.SetTexture("_ChestBumpMap", val.GetTexture("_ChestBumpMap"));
				((Renderer)vis.m_bodyModel).material.SetTexture("_ChestMetal", val.GetTexture("_ChestMetal"));
			}
		}
		else if (val.HasProperty("_LegsTex" + text) && (Object)(object)val.GetTexture("_LegsTex" + text) != (Object)null)
		{
			((Renderer)vis.m_bodyModel).material.SetTexture("_LegsTex", val.GetTexture("_LegsTex" + text));
			((Renderer)vis.m_bodyModel).material.SetTexture("_LegsBumpMap", val.GetTexture("_LegsBumpMap" + text));
			((Renderer)vis.m_bodyModel).material.SetTexture("_LegsMetal", val.GetTexture("_LegsMetal" + text));
		}
		else if (val.HasProperty("_LegsTex") && (Object)(object)val.GetTexture("_LegsTex") != (Object)null)
		{
			((Renderer)vis.m_bodyModel).material.SetTexture("_LegsTex", val.GetTexture("_LegsTex"));
			((Renderer)vis.m_bodyModel).material.SetTexture("_LegsBumpMap", val.GetTexture("_LegsBumpMap"));
			((Renderer)vis.m_bodyModel).material.SetTexture("_LegsMetal", val.GetTexture("_LegsMetal"));
		}
	}

	private static void GetVariantAndLevelValues(ZDO zdo, ItemData id, string zdoName, out int variant, out int maxVariant, out int level, out int maxLevel, bool vanillaVariant = false)
	{
		variant = 0;
		maxVariant = 0;
		level = 1;
		maxLevel = 4;
		if (zdo != null)
		{
			variant = zdo.GetInt(zdoName + "Variant" + (vanillaVariant ? "" : "HTD"), 0);
			maxVariant = zdo.GetInt(zdoName + "MaxVariantHTD", 1);
			level = zdo.GetInt(zdoName + "LevelHTD", 1);
			maxLevel = zdo.GetInt(zdoName + "MaxLevelHTD", 4);
		}
		else if (id != null)
		{
			variant = id.m_variant;
			maxVariant = id.m_shared.m_variants;
			level = id.m_quality;
			maxLevel = id.m_shared.m_maxQuality;
		}
	}

	public static void ApplyVisualEffects(VisEquipment vis)
	{
		ZNetView nview = vis.m_nview;
		ZDO zdo = ((nview != null) ? nview.GetZDO() : null);
		bool flag = false;
		ClearAttachOthers(ref vis);
		int variant = 0;
		int maxVariant = 0;
		int level = 1;
		int maxLevel = 4;
		Humanoid component = ((Component)vis).gameObject.GetComponent<Humanoid>();
		string zdoName;
		if (vis.m_chestItemInstances != null && vis.m_chestItemInstances.Count > 0)
		{
			zdoName = "ChestItem";
			GetVariantAndLevelValues(zdo, component?.m_chestItem, zdoName, out variant, out maxVariant, out level, out maxLevel);
			for (int i = 0; i < vis.m_chestItemInstances.Count; i++)
			{
				GameObject obj = vis.m_chestItemInstances[i];
				if (!TryApply(ref vis, ref obj, vis.m_currentChestItemHash, zdoName, variant, maxVariant, level, maxLevel))
				{
					ApplyArmorMat(vis, vis.m_currentChestItemHash, chest: true);
				}
				flag = false;
			}
		}
		if (vis.m_legItemInstances != null && vis.m_legItemInstances.Count > 0)
		{
			zdoName = "LegItem";
			GetVariantAndLevelValues(zdo, component?.m_legItem, zdoName, out variant, out maxVariant, out level, out maxLevel);
			for (int j = 0; j < vis.m_legItemInstances.Count; j++)
			{
				GameObject obj2 = vis.m_legItemInstances[j];
				if (!TryApply(ref vis, ref obj2, vis.m_currentLegItemHash, zdoName, variant, maxVariant, level, maxLevel))
				{
					ApplyArmorMat(vis, vis.m_currentLegItemHash, chest: false);
				}
				flag = false;
			}
		}
		if ((Object)(object)vis.m_helmetItemInstance != (Object)null)
		{
			zdoName = "HelmetItem";
			GetVariantAndLevelValues(zdo, component?.m_helmetItem, zdoName, out variant, out maxVariant, out level, out maxLevel);
			TryApply(ref vis, ref vis.m_helmetItemInstance, vis.m_currentHelmetItemHash, zdoName, variant, maxVariant, level, maxLevel);
		}
		if (vis.m_shoulderItemInstances != null && vis.m_shoulderItemInstances.Count > 0)
		{
			zdoName = "ShoulderItem";
			GetVariantAndLevelValues(zdo, component?.m_shoulderItem, zdoName, out variant, out maxVariant, out level, out maxLevel, vanillaVariant: true);
			for (int k = 0; k < vis.m_shoulderItemInstances.Count; k++)
			{
				GameObject obj3 = vis.m_shoulderItemInstances[k];
				TryApply(ref vis, ref obj3, vis.m_currentShoulderItemHash, zdoName, variant, maxVariant, level, maxLevel, vanillaVariant: true);
			}
		}
		if (vis.m_utilityItemInstances != null && vis.m_utilityItemInstances.Count > 0)
		{
			zdoName = "UtilityItem";
			GetVariantAndLevelValues(zdo, component?.m_utilityItem, zdoName, out variant, out maxVariant, out level, out maxLevel);
			for (int l = 0; l < vis.m_utilityItemInstances.Count; l++)
			{
				GameObject obj4 = vis.m_utilityItemInstances[l];
				TryApply(ref vis, ref obj4, vis.m_currentUtilityItemHash, zdoName, variant, maxVariant, level, maxLevel);
			}
		}
		if ((Object)(object)vis.m_rightItemInstance != (Object)null)
		{
			zdoName = "RightItem";
			GetVariantAndLevelValues(zdo, component?.m_rightItem, zdoName, out variant, out maxVariant, out level, out maxLevel);
			TryApply(ref vis, ref vis.m_rightItemInstance, vis.m_currentRightItemHash, zdoName, variant, maxVariant, level, maxLevel);
			GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(vis.m_currentRightItemHash);
			if ((Object)(object)itemPrefab != (Object)null)
			{
				ItemDrop component2 = itemPrefab.GetComponent<ItemDrop>();
				if ((Object)(object)component2 != (Object)null)
				{
					TryAttachOther(ref vis, component2.m_itemData.m_shared, itemPrefab, variant, maxVariant, level, maxLevel);
				}
			}
		}
		if ((Object)(object)vis.m_rightBackItemInstance != (Object)null)
		{
			zdoName = "RightBackItem";
			GetVariantAndLevelValues(zdo, component?.m_hiddenRightItem, zdoName, out variant, out maxVariant, out level, out maxLevel);
			TryApply(ref vis, ref vis.m_rightBackItemInstance, vis.m_currentRightBackItemHash, zdoName, variant, maxVariant, level, maxLevel);
			GameObject itemPrefab2 = ObjectDB.instance.GetItemPrefab(vis.m_currentRightBackItemHash);
			if ((Object)(object)itemPrefab2 != (Object)null)
			{
				ItemDrop component3 = itemPrefab2.GetComponent<ItemDrop>();
				if ((Object)(object)component3 != (Object)null)
				{
					TryAttachOther(ref vis, component3.m_itemData.m_shared, itemPrefab2, variant, maxVariant, level, maxLevel);
				}
			}
		}
		if ((Object)(object)vis.m_leftItemInstance != (Object)null)
		{
			zdoName = "LeftItem";
			GetVariantAndLevelValues(zdo, component?.m_leftItem, zdoName, out variant, out maxVariant, out level, out maxLevel, vanillaVariant: true);
			TryApply(ref vis, ref vis.m_leftItemInstance, vis.m_currentLeftItemHash, zdoName, variant, maxVariant, level, maxLevel, vanillaVariant: true);
			GameObject itemPrefab3 = ObjectDB.instance.GetItemPrefab(vis.m_currentLeftItemHash);
			if ((Object)(object)itemPrefab3 != (Object)null)
			{
				ItemDrop component4 = itemPrefab3.GetComponent<ItemDrop>();
				if ((Object)(object)component4 != (Object)null)
				{
					TryAttachOther(ref vis, component4.m_itemData.m_shared, itemPrefab3, variant, maxVariant, level, maxLevel);
				}
			}
		}
		if (!((Object)(object)vis.m_leftBackItemInstance != (Object)null))
		{
			return;
		}
		zdoName = "LeftBackItem";
		GetVariantAndLevelValues(zdo, component?.m_hiddenLeftItem, zdoName, out variant, out maxVariant, out level, out maxLevel, vanillaVariant: true);
		TryApply(ref vis, ref vis.m_leftBackItemInstance, vis.m_currentLeftBackItemHash, zdoName, variant, maxVariant, level, maxLevel, vanillaVariant: true);
		GameObject itemPrefab4 = ObjectDB.instance.GetItemPrefab(vis.m_currentLeftBackItemHash);
		if ((Object)(object)itemPrefab4 != (Object)null)
		{
			ItemDrop component5 = itemPrefab4.GetComponent<ItemDrop>();
			if ((Object)(object)component5 != (Object)null)
			{
				TryAttachOther(ref vis, component5.m_itemData.m_shared, itemPrefab4, variant, maxVariant, level, maxLevel);
			}
		}
	}
}
[HarmonyPatch]
public class HumanoidPatch
{
	[HarmonyPatch(typeof(Humanoid), "OnRagdollCreated")]
	[HarmonyPrefix]
	public static void OnRagdollCreatedPrefix(Humanoid __instance, Ragdoll ragdoll)
	{
		//IL_020e: 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_0227: Unknown result type (might be due to invalid IL or missing references)
		//IL_022c: Unknown result type (might be due to invalid IL or missing references)
		//IL_023f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0244: Unknown result type (might be due to invalid IL or missing references)
		//IL_0246: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)ragdoll == (Object)null || ((Character)__instance).m_level == 1)
		{
			return;
		}
		int num = 1;
		try
		{
			num++;
			string prefabName = Utils.GetPrefabName(((Component)__instance).gameObject);
			num++;
			LevelEffects componentInChildren = ZNetScene.instance.GetPrefab(prefabName).GetComponentInChildren<LevelEffects>();
			string nodeName = null;
			string nodeName2 = null;
			if ((Object)(object)componentInChildren != (Object)null)
			{
				num++;
				if (((Character)__instance).m_level <= 3)
				{
					num++;
					int num2 = ((Character)__instance).m_level - 2;
					num++;
					if ((Object)(object)componentInChildren.m_baseEnableObject != (Object)null)
					{
						nodeName = ((Object)componentInChildren.m_baseEnableObject).name;
					}
					num++;
					if (componentInChildren.m_levelSetups == null && componentInChildren.m_levelSetups.Count > 0 && componentInChildren.m_levelSetups.Count >= num2 + 1)
					{
						num++;
						LevelSetup val = componentInChildren.m_levelSetups[num2];
						num++;
						if ((Object)(object)val.m_enableObject != (Object)null)
						{
							nodeName2 = ((Object)val.m_enableObject).name;
						}
					}
				}
				else
				{
					num++;
					LevelSetup val2 = componentInChildren.m_levelSetups[componentInChildren.m_levelSetups.Count - 1];
					num++;
					if ((Object)(object)val2.m_enableObject != (Object)null)
					{
						nodeName2 = ((Object)val2.m_enableObject).name;
					}
				}
				if (nodeName != null)
				{
					num++;
					Transform val3 = RecursiveSearchFunctions.ChildNodeFinderDepthFirst(((Component)ragdoll).gameObject.transform, ref nodeName);
					num++;
					if ((Object)(object)val3 != (Object)null)
					{
						num++;
						((Component)((Component)val3).transform).gameObject.SetActive(false);
						num++;
					}
				}
				if (nodeName2 != null)
				{
					num++;
					Transform val4 = RecursiveSearchFunctions.ChildNodeFinderDepthFirst(((Component)ragdoll).transform, ref nodeName2);
					num++;
					if ((Object)(object)val4 != (Object)null)
					{
						num++;
						((Component)((Component)val4).transform).gameObject.SetActive(true);
					}
				}
			}
			num++;
			Vector3 val5 = ((Component)__instance).transform.localScale - new Vector3(1f, 1f, 1f);
			num++;
			Transform transform = ((Component)ragdoll).gameObject.transform;
			transform.localScale += val5;
		}
		catch (Exception ex)
		{
			Plugin.Log.LogWarning((object)"And Error as Occurred in Humanoid/RagdollCreated Patch, This error was caught and won't interupt flow.");
			Plugin.Log.LogError((object)$"Exception Thrown: {ex.GetType()} last line executed: {num}");
			Plugin.Log.LogError((object)ex.Message);
			Plugin.Log.LogError((object)ex.StackTrace);
			Plugin.Log.LogMessage((object)"End of logged Exception");
		}
	}
}
[HarmonyPatch]
internal class ItemDropPatch
{
	[HarmonyPatch(typeof(ItemDrop), "Start")]
	[HarmonyPostfix]
	public static void ItemDropStartPostfix(ItemDrop __instance)
	{
		Transform val = null;
		Transform[] array = null;
		List<GameObject> list = new List<GameObject>();
		Transform val2 = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(((Component)__instance).gameObject.transform, "attach");
		if ((Object)(object)val2 != (Object)null)
		{
			list.Add(((Component)((Component)val2).transform).gameObject);
		}
		Transform val3 = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(((Component)__instance).gameObject.transform, "attach_other");
		if ((Object)(object)val3 != (Object)null)
		{
			list.Add(((Component)((Component)val3).transform).gameObject);
		}
		if (list.Count <= 0)
		{
			return;
		}
		foreach (GameObject item in list)
		{
			GameObject go = item;
			val = HelperMethods.TryApplyChildStyle(ref go, __instance.m_itemData.m_variant, __instance.m_itemData.m_shared.m_variants);
			if ((Object)(object)val != (Object)null)
			{
				GameObject go2 = ((Component)((Component)val).transform).gameObject;
				array = HelperMethods.TryApplyChildLevel(ref go2, __instance.m_itemData.m_quality, __instance.m_itemData.m_shared.m_maxQuality);
			}
			else
			{
				array = HelperMethods.TryApplyChildLevel(ref go, __instance.m_itemData.m_quality, __instance.m_itemData.m_shared.m_maxQuality);
			}
		}
	}
}
[HarmonyPatch]
public class ItemStandPatches
{
	[HarmonyPatch(typeof(ItemStand), "GetAttachPrefab")]
	[HarmonyPostfix]
	private static void GetAttachPrefabPostfix(ItemStand __instance, GameObject item, ref GameObject __result)
	{
		Transform val = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(item.transform, "attach_stand");
		if (!((Object)(object)val != (Object)null))
		{
			return;
		}
		Transform val2 = val;
		string nodeName = "style_" + __instance.m_visualVariant;
		Transform val3 = RecursiveSearchFunctions.ChildNodeFinderBreadthFirst(val2, nodeName);
		if ((Object)(object)val3 != (Object)null)
		{
			val2 = val3;
		}
		string text = ((Component)((Component)__instance).transform).gameObject.GetComponent<Piece>()?.m_description;
		if (text != null && text.Trim().Length > 0 && val2.childCount > 0)
		{
			for (int i = 0; i < val2.childCount; i++)
			{
				Transform child = val2.GetChild(i);
				char c = ((Object)((Component)child).gameObject).name[0];
				if ((c == 'v' || c == 'V') && text.Contains("vertical"))
				{
					val2 = child;
					break;
				}
				if ((c == 'h' || c == 'H') && text.Contains("horizontal"))
				{
					val2 = child;
					break;
				}
			}
		}
		__result = ((Component)val2).gameObject;
	}
}
[BepInPlugin("htd.sam", "Shapekeys and More", "2.4.1")]
public class Plugin : BaseUnityPlugin
{
	public const string Version = "2.4.1";

	public const string ModName = "Shapekeys and More";

	public const string GUID = "htd.sam";

	private Harmony _Harmony;

	public static ManualLogSource Log;

	public readonly Harmony harmony = new Harmony("htd.sam");

	private void Awake()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		_Harmony = new Harmony("htd.sam");
		Log = ((BaseUnityPlugin)this).Logger;
		_Harmony.PatchAll();
	}
}
public class RecursiveSearchFunctions
{
	public static Transform ChildNodeFinderDepthFirst(Transform target, ref string nodeName, bool contains = false)
	{
		if ((!contains && ((Object)((Component)target).gameObject).name == nodeName) || (contains && ((Object)((Component)target).gameObject).name.Contains(nodeName)))
		{
			return target;
		}
		if (target.childCount > 0)
		{
			for (int i = 0; i < target.childCount; i++)
			{
				Transform val = ChildNodeFinderDepthFirst(target.GetChild(i), nodeName, contains);
				if ((Object)(object)val != (Object)null)
				{
					return val;
				}
			}
		}
		return null;
	}

	public static Transform ChildNodeFinderDepthFirst(Transform target, string nodeName, bool contains = false)
	{
		return ChildNodeFinderDepthFirst(target, ref nodeName, contains);
	}

	public static Transform ChildNodeFinderBreadthFirst(Transform[] targets, ref string nodeName, bool contains = false)
	{
		List<Transform[]> list = new List<Transform[]>();
		foreach (Transform val in targets)
		{
			if ((!contains && ((Object)((Component)val).gameObject).name == nodeName) || (contains && ((Object)((Component)val).gameObject).name.Contains(nodeName)))
			{
				return val;
			}
			if (val.childCount > 0)
			{
				Transform[] array = (Transform[])(object)new Transform[val.childCount];
				for (int j = 0; j < val.childCount; j++)
				{
					array[j] = val.GetChild(j);
				}
				list.Add(array);
			}
		}
		if (list.Count > 0)
		{
			foreach (Transform[] item in list)
			{
				Transform val2 = ChildNodeFinderBreadthFirst(item, ref nodeName, contains);
				if ((Object)(object)val2 != (Object)null)
				{
					return val2;
				}
			}
		}
		return null;
	}

	public static Transform ChildNodeFinderBreadthFirst(Transform target, string nodeName, bool contains = false)
	{
		return ChildNodeFinderBreadthFirst((Transform[])(object)new Transform[1] { target }, ref nodeName, contains);
	}

	public static void ChildNodesFinderDepthFirst(Transform target, string nodeName, ref int numberOfNodes, ref List<Transform> nestedTargets, bool contains = false)
	{
		if (((!contains && ((Object)((Component)target).gameObject).name == nodeName) || (contains && ((Object)((Component)target).gameObject).name.Contains(nodeName))) && nestedTargets.Count < numberOfNodes)
		{
			nestedTargets.Add(target);
		}
		if (target.childCount > 0 && nestedTargets.Count < numberOfNodes)
		{
			for (int i = 0; i < target.childCount; i++)
			{
				ChildNodesFinderDepthFirst(target.GetChild(i), nodeName, ref numberOfNodes, ref nestedTargets, contains);
			}
		}
	}

	public static void ChildNodesFinderDepthFirst(Transform target, string nodeName, int numberOfNodes, ref List<Transform> nestedTargets, bool contains = false)
	{
		ChildNodesFinderDepthFirst(target, nodeName, ref numberOfNodes, ref nestedTargets, contains);
	}

	public static void ChildNodesFinderBreadthFirst(Transform[] targets, ref string nodeName, ref int numberOfNodes, ref List<Transform> nestedTargets, bool contains = false)
	{
		List<Transform[]> list = new List<Transform[]>();
		foreach (Transform val in targets)
		{
			if (((!contains && ((Object)((Component)val).gameObject).name == nodeName) || (contains && ((Object)((Component)val).gameObject).name.Contains(nodeName))) && nestedTargets.Count < numberOfNodes)
			{
				nestedTargets.Add(val);
				if (nestedTargets.Count >= numberOfNodes)
				{
					return;
				}
			}
			if (val.childCount > 0)
			{
				Transform[] array = (Transform[])(object)new Transform[val.childCount];
				for (int j = 0; j < val.childCount; j++)
				{
					array[j] = val.GetChild(j);
				}
				list.Add(array);
			}
		}
		if (list.Count <= 0 || nestedTargets.Count >= numberOfNodes)
		{
			return;
		}
		foreach (Transform[] item in list)
		{
			ChildNodesFinderBreadthFirst(item, ref nodeName, ref numberOfNodes, ref nestedTargets, contains);
			if (nestedTargets.Count >= numberOfNodes)
			{
				break;
			}
		}
	}

	public static void ChildNodesFinderBreadthFirst(Transform[] targets, string nodeName, int numberOfNodes, ref List<Transform> nestedTargets, bool contains = false)
	{
		ChildNodesFinderBreadthFirst(targets, ref nodeName, ref numberOfNodes, ref nestedTargets, contains);
	}

	public static void ChildNodesFinderBreadthFirst(Transform target, string nodeName, int numberOfNodes, ref List<Transform> nestedTargets, bool contains = false)
	{
		ChildNodesFinderBreadthFirst((Transform[])(object)new Transform[1] { target }, ref nodeName, ref numberOfNodes, ref nestedTargets, contains);
	}
}
[HarmonyPatch(typeof(VisEquipment))]
public class VisEquipmentPatches
{
	[HarmonyPatch("Awake")]
	[HarmonyPostfix]
	public static void AddVisEquipmentOther(VisEquipment __instance)
	{
		VisEquipmentOther visEquipmentOther = ((Component)__instance).gameObject.AddComponent<VisEquipmentOther>();
		visEquipmentOther.visEquipment = __instance;
		visEquipmentOther.CreateAttachOtherJoints();
	}

	[HarmonyPatch("SetShoulderItem")]
	[HarmonyPostfix]
	public static void SetShoulderItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.SHOULDER, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey, isVanilla: true);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("SetChestItem")]
	[HarmonyPostfix]
	public static void SetChestItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.CHEST, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("SetUtilityItem")]
	[HarmonyPostfix]
	public static void SetUtilityItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.UTILITY, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("SetHelmetItem")]
	[HarmonyPostfix]
	public static void SetHelmetItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.HEAD, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("SetLegItem")]
	[HarmonyPostfix]
	public static void SetLegItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.LEGS, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("SetRightItem")]
	[HarmonyPostfix]
	public static void SetRightItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.RIGHTHAND, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("SetRightBackItem")]
	[HarmonyPostfix]
	public static void SetRightBackItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.RIGHTBACK, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("SetLeftItem")]
	[HarmonyPostfix]
	public static void SetLeftItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.LEFTHAND, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey, isVanilla: true);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("SetLeftBackItem")]
	[HarmonyPostfix]
	public static void SetLeftBackItemPatch(VisEquipment __instance, string name)
	{
		ZNetView nview = __instance.m_nview;
		if (((nview != null) ? nview.GetZDO() : null) != null && __instance.m_nview.IsOwner() && __instance.m_isPlayer)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			Humanoid component = ((Component)__instance).gameObject.GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null)
			{
				ItemData id = null;
				string zdoKey = "";
				HelperMethods.GetItemDataFromHumanoid(component, HelperMethods.ItemType.LEFTBACK, out id, out zdoKey);
				HelperMethods.SetItemVariantZDO(zDO, id, zdoKey, isVanilla: true);
				HelperMethods.SetItemLevelZDO(zDO, id, zdoKey);
			}
		}
	}

	[HarmonyPatch("UpdateEquipmentVisuals")]
	[HarmonyPostfix]
	public static void UpdateEquipmentVisualsPostfix(VisEquipment __instance)
	{
		if (__instance.m_isPlayer)
		{
			HelperMethods.ApplyVisualEffects(__instance);
			__instance.UpdateLodgroup();
		}
	}
}
public class VisEquipmentOther : MonoBehaviour
{
	public VisEquipment visEquipment;

	public Transform backAtgeirOther;

	public Transform backBowOther;

	public Transform backMeleeOther;

	public Transform backShieldOther;

	public Transform backToolOther;

	public Transform backTwohandedMeleeOther;

	public void ClearUpdate()
	{
		visEquipment.m_nview.GetZDO().Set("UpdateVisualsHTD", false);
	}

	private Transform CreateAttachOtherJoint(Transform joint)
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Expected O, but got Unknown
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)joint == (Object)null)
		{
			return null;
		}
		GameObject val = new GameObject();
		((Object)val).name = ((Object)joint).name + "Other";
		val.transform.parent = joint.parent;
		val.transform.localPosition = joint.localPosition;
		val.transform.localRotation = joint.localRotation;
		val.transform.localScale = joint.localScale;
		val.SetActive(((Component)joint).gameObject.activeSelf);
		return val.transform;
	}

	public void CreateAttachOtherJoints()
	{
		backAtgeirOther = CreateAttachOtherJoint(visEquipment.m_backAtgeir);
		backBowOther = CreateAttachOtherJoint(visEquipment.m_backBow);
		backMeleeOther = CreateAttachOtherJoint(visEquipment.m_backMelee);
		backTwohandedMeleeOther = CreateAttachOtherJoint(visEquipment.m_backTwohandedMelee);
		backShieldOther = CreateAttachOtherJoint(visEquipment.m_backShield);
		backToolOther = CreateAttachOtherJoint(visEquipment.m_backTool);
	}
}