Decompiled source of DestructibleAvatarCodeMod v1.0.3

DestructibleAvatar.dll

Decompiled 4 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BoneLib;
using DestructibleAvatar;
using HarmonyLib;
using Il2CppInterop.Runtime.Attributes;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppSLZ.Marrow;
using Il2CppSLZ.Marrow.Interaction;
using MelonLoader;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(Core), "DestructibleAvatar", "1.0.0", "notnotnotswipez", null)]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("DestructibleAvatar")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("DestructibleAvatar")]
[assembly: AssemblyTitle("DestructibleAvatar")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace DestructibleAvatar
{
	public class Core : MelonMod
	{
		public override void OnInitializeMelon()
		{
		}
	}
	[RegisterTypeInIl2Cpp]
	public class DestructiblePerson : MonoBehaviour
	{
		private Transform emptyRigMatch;

		private RigManager rigManager;

		private bool onRig = false;

		private Transform physicsRig;

		public BodyPart leftShoulder;

		public BodyPart leftForearm;

		public BodyPart leftHand;

		public BodyPart rightShoulder;

		public BodyPart rightForearm;

		public BodyPart rightHand;

		public BodyPart chest;

		public BodyPart spine;

		public BodyPart head;

		public BodyPart leftThigh;

		public BodyPart leftKnee;

		public BodyPart leftFoot;

		public BodyPart rightThigh;

		public BodyPart rightKnee;

		public BodyPart rightFoot;

		private bool leftLegMissing = false;

		private bool rightLegMissing = false;

		private bool checkDetachments = false;

		public static Dictionary<int, DestructiblePerson> rigToPersonCache = new Dictionary<int, DestructiblePerson>();

		private Rigidbody pelvisBody;

		private Vector3 lastPelvisVelocity;

		private Dictionary<ConfigurableJoint, BodyPart> jointToCheckWithPart = new Dictionary<ConfigurableJoint, BodyPart>();

		private void CreateParts()
		{
			leftShoulder = new BodyPart("ShoulderLf", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/Cylinder", "ShoulderLf");
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/Cylinder", "ShoulderLf");
			});
			leftForearm = new BodyPart("ElbowLf", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/l_Arm_Elbow_CurveSHJnt/Cylinder", "ElbowLf");
				Transform val4 = ((Component)physicsRig).transform.Find("ElbowLf/BodyLogSlot");
				if (Object.op_Implicit((Object)(object)val4))
				{
					((Component)val4).gameObject.SetActive(false);
				}
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/l_Arm_Elbow_CurveSHJnt/Cylinder", "ElbowLf");
				Transform val3 = ((Component)physicsRig).transform.Find("ElbowLf/BodyLogSlot");
				if (Object.op_Implicit((Object)(object)val3))
				{
					((Component)val3).gameObject.SetActive(true);
				}
			});
			leftHand = new BodyPart("Hand (left)", emptyRigMatch, delegate(GameObject go)
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/l_Arm_Elbow_CurveSHJnt/l_WristSHJnt/l_Hand_1SHJnt/Cylinder", "Hand (left)");
				MakeFakeHandJoint(rigManager.physicsRig.leftHand, go);
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/l_Arm_Elbow_CurveSHJnt/l_WristSHJnt/l_Hand_1SHJnt/Cylinder", "Hand (left)");
			});
			rightShoulder = new BodyPart("ShoulderRt", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/Cylinder", "ShoulderRt");
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/Cylinder", "ShoulderRt");
			});
			rightForearm = new BodyPart("ElbowRt", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt/Cylinder", "ElbowRt");
				Transform val2 = ((Component)physicsRig).transform.Find("ElbowRt/BodyLogSlot");
				if (Object.op_Implicit((Object)(object)val2))
				{
					((Component)val2).gameObject.SetActive(false);
				}
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt/Cylinder", "ElbowRt");
				Transform val = ((Component)physicsRig).transform.Find("ElbowRt/BodyLogSlot");
				if (Object.op_Implicit((Object)(object)val))
				{
					((Component)val).gameObject.SetActive(true);
				}
			});
			rightHand = new BodyPart("Hand (right)", emptyRigMatch, delegate(GameObject go)
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt/r_WristSHJnt/r_Hand_1SHJnt/Cylinder", "Hand (right)");
				MakeFakeHandJoint(rigManager.physicsRig.rightHand, go);
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt/r_WristSHJnt/r_Hand_1SHJnt/Cylinder", "Hand (right)");
			});
			chest = new BodyPart("Chest", emptyRigMatch, delegate
			{
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder0");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder1");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder2");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder3");
				DisablePhysicsPart("Chest");
			}, delegate
			{
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder0");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder1");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder2");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Cylinder3");
				EnablePhysicsPart("Chest");
			});
			spine = new BodyPart("Spine", emptyRigMatch, delegate
			{
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Cylinder");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Cylinder1");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Cylinder");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Cylinder1");
				DisablePhysicsPart("Spine");
			}, delegate
			{
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Cylinder");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Cylinder1");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Cylinder");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Cylinder1");
				EnablePhysicsPart("Spine");
			});
			head = new BodyPart("Head", emptyRigMatch, delegate
			{
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Neck_01SHJnt/Cylinder");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Neck_01SHJnt/Neck_02SHJnt/Neck_TopSHJnt/Head_TopSHJnt/Cylinder");
				DisableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Neck_01SHJnt/Neck_02SHJnt/Neck_TopSHJnt/Head_JawSHJnt/Cylinder");
				DisablePhysicsPart("Head");
			}, delegate
			{
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Neck_01SHJnt/Cylinder");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Neck_01SHJnt/Neck_02SHJnt/Neck_TopSHJnt/Head_TopSHJnt/Cylinder");
				EnableVisualPart("MAINSHJnt/ROOTSHJnt/Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Neck_01SHJnt/Neck_02SHJnt/Neck_TopSHJnt/Head_JawSHJnt/Cylinder");
				EnablePhysicsPart("Head");
			});
			leftThigh = new BodyPart("HipLf", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/l_Leg_HipSHJnt/Cylinder", "HipLf");
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/l_Leg_HipSHJnt/Cylinder", "HipLf");
			});
			leftKnee = new BodyPart("KneeLf", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/l_Leg_HipSHJnt/l_Leg_KneeSHJnt/Cylinder", "KneeLf");
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/l_Leg_HipSHJnt/l_Leg_KneeSHJnt/Cylinder", "KneeLf");
			});
			leftFoot = new BodyPart("Foot (left)", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/l_Leg_HipSHJnt/l_Leg_KneeSHJnt/l_Leg_AnkleSHJnt/Cylinder", "Foot (left)");
				leftLegMissing = true;
				if (rightLegMissing)
				{
					DisableRigLegs();
				}
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/l_Leg_HipSHJnt/l_Leg_KneeSHJnt/l_Leg_AnkleSHJnt/Cylinder", "Foot (left)");
				leftLegMissing = false;
				if (!rightLegMissing)
				{
					EnableRigLegs();
				}
			});
			rightThigh = new BodyPart("HipRt", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/r_Leg_HipSHJnt/Cylinder", "HipRt");
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/r_Leg_HipSHJnt/Cylinder", "HipRt");
			});
			rightKnee = new BodyPart("KneeRt", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/r_Leg_HipSHJnt/r_Leg_KneeSHJnt/Cylinder", "KneeRt");
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/r_Leg_HipSHJnt/r_Leg_KneeSHJnt/Cylinder", "KneeRt");
			});
			rightFoot = new BodyPart("Foot (right)", emptyRigMatch, delegate
			{
				DisablePart("MAINSHJnt/ROOTSHJnt/r_Leg_HipSHJnt/r_Leg_KneeSHJnt/r_Leg_AnkleSHJnt/Cylinder", "Foot (right)");
				rightLegMissing = true;
				if (leftLegMissing)
				{
					DisableRigLegs();
				}
			}, delegate
			{
				EnablePart("MAINSHJnt/ROOTSHJnt/r_Leg_HipSHJnt/r_Leg_KneeSHJnt/r_Leg_AnkleSHJnt/Cylinder", "Foot (right)");
				rightLegMissing = false;
				if (!leftLegMissing)
				{
					EnableRigLegs();
				}
			});
			spine.AddChild(chest);
			chest.AddChild(leftShoulder);
			chest.AddChild(rightShoulder);
			chest.AddChild(head);
			leftThigh.AddChild(leftKnee);
			leftKnee.AddChild(leftFoot);
			rightThigh.AddChild(rightKnee);
			rightKnee.AddChild(rightFoot);
			spine.AddChild(leftThigh);
			spine.AddChild(rightThigh);
			leftShoulder.AddChild(leftForearm);
			leftForearm.AddChild(leftHand);
			rightShoulder.AddChild(rightForearm);
			rightForearm.AddChild(rightHand);
			MakeJointWithPart("Head", head);
			MakeJointWithPart("ShoulderLf", leftShoulder);
			MakeJointWithPart("ElbowLf", leftForearm);
			MakeJointWithPart("Hand (left)", leftHand);
			MakeJointWithPart("ShoulderRt", rightShoulder);
			MakeJointWithPart("ElbowRt", rightForearm);
			MakeJointWithPart("Hand (right)", rightHand);
			MakeJointWithPart("HipLf", leftThigh);
			MakeJointWithPart("KneeLf", leftKnee);
			MakeJointWithPart("Foot (left)", leftFoot);
			MakeJointWithPart("HipRt", rightThigh);
			MakeJointWithPart("KneeRt", rightKnee);
			MakeJointWithPart("Foot (right)", rightFoot);
		}

		private void MakeJointWithPart(string physicsPart, BodyPart bodyPart)
		{
			ConfigurableJoint component = ((Component)((Component)physicsRig).transform.Find(physicsPart)).GetComponent<ConfigurableJoint>();
			jointToCheckWithPart.Add(component, bodyPart);
		}

		private void OnDisable()
		{
			if (Object.op_Implicit((Object)(object)rigManager) && ((Object)Player.RigManager).GetInstanceID() == ((Object)rigManager).GetInstanceID())
			{
				ReformEntireRig();
			}
		}

		private void FixedUpdate()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: 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_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
			if (!checkDetachments)
			{
				return;
			}
			Vector3 val;
			foreach (KeyValuePair<ConfigurableJoint, BodyPart> item in jointToCheckWithPart)
			{
				val = ((Joint)item.Key).currentForce;
				float magnitude = ((Vector3)(ref val)).magnitude;
				if (magnitude > 2000f)
				{
					item.Value.Detach();
				}
			}
			if (leftLegMissing && rightLegMissing && Object.op_Implicit((Object)(object)rigManager) && !rigManager.physicsRig.legLf.shutdown)
			{
				DisableRigLegs();
			}
			Vector3 velocity = pelvisBody.velocity;
			val = velocity - lastPelvisVelocity;
			float magnitude2 = ((Vector3)(ref val)).magnitude;
			if (magnitude2 > 5f)
			{
				leftThigh.Detach();
				rightThigh.Detach();
			}
			else if (magnitude2 > 3f)
			{
				if (Random.Range(0f, 1f) < 0.5f)
				{
					leftThigh.Detach();
				}
				else
				{
					rightThigh.Detach();
				}
			}
			if (magnitude2 > 2f)
			{
				float num = magnitude2 - 2f;
				float num2 = Mathf.InverseLerp(0f, 7f, magnitude2) * 2f;
				if (((Object)rigManager).GetInstanceID() == ((Object)Player.RigManager).GetInstanceID())
				{
					rigManager.health.TAKEDAMAGE(num2);
				}
			}
			lastPelvisVelocity = velocity;
		}

		private void DisableRigLegs()
		{
			rigManager.physicsRig.RagdollRig();
			rigManager.physicsRig.DisableBallLoco();
			rigManager.physicsRig.PhysicalLegs();
			rigManager.physicsRig.legLf.ShutdownLimb();
			rigManager.physicsRig.legRt.ShutdownLimb();
		}

		private void EnableRigLegs()
		{
			rigManager.physicsRig.TurnOnRig();
			rigManager.physicsRig.UnRagdollRig();
			rigManager.physicsRig.EnableBallLoco();
			rigManager.physicsRig.KinematicLegs();
		}

		public void ReformEntireRig()
		{
			spine.Retach();
			checkDetachments = false;
			MelonCoroutines.Start(WaitAndStartBreakage());
		}

		private void MakeFakeHandJoint(Hand targetHand, GameObject go)
		{
			if (targetHand.HasAttachedObject())
			{
				Grip val = ((Il2CppObjectBase)targetHand.AttachedReceiver).TryCast<Grip>();
				if (Object.op_Implicit((Object)(object)val))
				{
					Rigidbody componentInParent = ((Component)val).GetComponentInParent<Rigidbody>();
					FixedJoint val2 = go.gameObject.AddComponent<FixedJoint>();
					((Joint)val2).breakForce = 4000f;
					((Joint)val2).connectedBody = componentInParent;
					val.ForceDetach(true);
				}
			}
		}

		private void Start()
		{
			emptyRigMatch = ((Component)this).transform.Find("EmptyRigMatch");
			rigManager = ((Component)this).GetComponentInParent<RigManager>();
			if (Object.op_Implicit((Object)(object)rigManager))
			{
				onRig = true;
				physicsRig = ((Component)rigManager.physicsRig).transform;
				CreateParts();
				rigToPersonCache.Add(((Object)rigManager).GetInstanceID(), this);
				pelvisBody = ((Component)((Rig)rigManager.physicsRig).m_pelvis).GetComponent<Rigidbody>();
				MelonCoroutines.Start(WaitAndStartBreakage());
			}
		}

		private void OnDestroy()
		{
			if (Object.op_Implicit((Object)(object)rigManager))
			{
				rigToPersonCache.Remove(((Object)rigManager).GetInstanceID());
			}
		}

		[HideFromIl2Cpp]
		private IEnumerator WaitAndStartBreakage()
		{
			yield return (object)new WaitForSecondsRealtime(10f);
			checkDetachments = true;
		}

		private void DisablePart(string pathFromAvatar, string pathFromPhysicsRig)
		{
			DisableVisualPart(pathFromAvatar);
			DisablePhysicsPart(pathFromPhysicsRig);
		}

		private void DisableVisualPart(string pathFromAvatar)
		{
			Transform val = ((Component)this).transform.Find(pathFromAvatar);
			if (Object.op_Implicit((Object)(object)val))
			{
				((Component)val).gameObject.SetActive(false);
			}
			else
			{
				MelonLogger.Msg("Failed to find: " + pathFromAvatar);
			}
		}

		private void DisablePhysicsPart(string pathFromPhysicsRig)
		{
			GameObject gameObject = ((Component)((Component)physicsRig).transform.Find(pathFromPhysicsRig)).gameObject;
			foreach (Collider componentsInChild in gameObject.GetComponentsInChildren<Collider>())
			{
				if (((Component)componentsInChild).gameObject.layer == 8)
				{
					((Component)componentsInChild).gameObject.layer = 9;
				}
			}
		}

		private void EnablePart(string pathFromAvatar, string pathFromPhysicsRig)
		{
			EnableVisualPart(pathFromAvatar);
			EnablePhysicsPart(pathFromPhysicsRig);
		}

		private void EnableVisualPart(string pathFromAvatar)
		{
			((Component)((Component)this).transform.Find(pathFromAvatar)).gameObject.SetActive(true);
		}

		private void EnablePhysicsPart(string pathFromPhysicsRig)
		{
			GameObject gameObject = ((Component)((Component)physicsRig).transform.Find(pathFromPhysicsRig)).gameObject;
			foreach (Collider componentsInChild in gameObject.GetComponentsInChildren<Collider>())
			{
				if (((Component)componentsInChild).gameObject.layer == 9)
				{
					((Component)componentsInChild).gameObject.layer = 8;
				}
			}
		}
	}
	public class BodyPart
	{
		private List<BodyPart> children = new List<BodyPart>();

		private string path;

		private Transform physicsCopy;

		private Action<GameObject> onDetach;

		private Action onReform;

		public bool detached = false;

		public BodyPart(string path, Transform physicsCopy, Action<GameObject> onDetach, Action onReform)
		{
			this.path = path;
			this.physicsCopy = physicsCopy;
			this.onDetach = onDetach;
			this.onReform = onReform;
		}

		public void Detach()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			if (detached)
			{
				return;
			}
			GameObject val = new GameObject();
			val.SetActive(false);
			Link(val.transform);
			GameObject val2 = Object.Instantiate<GameObject>(val);
			Return(val.transform);
			Object.DestroyImmediate((Object)(object)val);
			GameObject gameObject = ((Component)val2.transform.Find(path)).gameObject;
			foreach (MarrowJoint componentsInChild in gameObject.GetComponentsInChildren<MarrowJoint>())
			{
				Object.DestroyImmediate((Object)(object)componentsInChild);
			}
			foreach (ConfigurableJoint componentsInChild2 in gameObject.GetComponentsInChildren<ConfigurableJoint>())
			{
				Object.DestroyImmediate((Object)(object)componentsInChild2);
			}
			val2.SetActive(true);
			InvokeDetachAction(val2.transform);
		}

		public void AddChild(BodyPart part)
		{
			children.Add(part);
		}

		public void Retach()
		{
			InvokeRetachAction();
		}

		private void Link(Transform parent)
		{
			Transform val = physicsCopy.Find(path);
			val.parent = parent;
			foreach (BodyPart child in children)
			{
				child.Link(parent);
			}
		}

		private void InvokeDetachAction(Transform parent)
		{
			Transform val = parent.Find(path);
			onDetach(((Component)val.GetChild(0)).gameObject);
			detached = true;
			foreach (BodyPart child in children)
			{
				child.InvokeDetachAction(parent);
			}
		}

		private void InvokeRetachAction()
		{
			onReform();
			detached = false;
			foreach (BodyPart child in children)
			{
				child.InvokeRetachAction();
			}
		}

		private void Return(Transform original)
		{
			Transform val = original.Find(path);
			val.parent = physicsCopy;
			foreach (BodyPart child in children)
			{
				child.Return(original);
			}
		}
	}
	[HarmonyPatch(typeof(Hand), "UpdateHovering")]
	public class HandHoverPatchPrefix
	{
		public static bool Prefix(Hand __instance)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Invalid comparison between Unknown and I4
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Invalid comparison between Unknown and I4
			int instanceID = ((Object)Player.RigManager).GetInstanceID();
			if (((Object)__instance.manager).GetInstanceID() == instanceID && DestructiblePerson.rigToPersonCache.ContainsKey(instanceID))
			{
				DestructiblePerson destructiblePerson = DestructiblePerson.rigToPersonCache[instanceID];
				if ((int)__instance.handedness == 1 && destructiblePerson.leftHand.detached)
				{
					__instance.HoveringReceiver = null;
					__instance.farHoveringReciever = null;
					return false;
				}
				if ((int)__instance.handedness == 2 && destructiblePerson.rightHand.detached)
				{
					__instance.HoveringReceiver = null;
					__instance.farHoveringReciever = null;
					return false;
				}
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(HeadSFX), "DeathVocal")]
	public class HeadSFXPatchPrefix
	{
		public static void Prefix(HeadSFX __instance)
		{
			if (DestructiblePerson.rigToPersonCache.ContainsKey(((Object)((Rig)__instance._physRig).manager).GetInstanceID()))
			{
				DestructiblePerson destructiblePerson = DestructiblePerson.rigToPersonCache[((Object)((Rig)__instance._physRig).manager).GetInstanceID()];
				destructiblePerson.ReformEntireRig();
			}
		}
	}
}