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();
}
}
}
}