Decompiled source of PhysicsFingers v1.0.0

Mods/FingerPhysics.dll

Decompiled 7 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BoneLib.BoneMenu;
using FingerPhysics;
using HarmonyLib;
using Il2CppSLZ.Marrow;
using Il2CppSLZ.Marrow.Interaction;
using Il2CppSLZ.VRMK;
using MelonLoader;
using MelonLoader.Preferences;
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(Main), "Finger Physics", "1.0.0", "EvroDev", "")]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("FingerPhysics")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+517ac41acae92c317bcb1bcd1a75c96de6959066")]
[assembly: AssemblyProduct("FingerPhysics")]
[assembly: AssemblyTitle("FingerPhysics")]
[assembly: AssemblyVersion("1.0.0.0")]
[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 FingerPhysics
{
	[HarmonyPatch(typeof(ArtRig))]
	public static class ArtOutputUpdatePatch
	{
		public static Dictionary<ArtRig, Avatar> lastFoundAvatars = new Dictionary<ArtRig, Avatar>();

		[HarmonyPatch("ArtOutputLateUpdate")]
		[HarmonyPostfix]
		public static void LateUpdatePostfix(ArtRig __instance)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Invalid comparison between Unknown and I4
			//IL_0306: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Unknown result type (might be due to invalid IL or missing references)
			//IL_032f: Unknown result type (might be due to invalid IL or missing references)
			//IL_033b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0358: Unknown result type (might be due to invalid IL or missing references)
			//IL_0364: Unknown result type (might be due to invalid IL or missing references)
			//IL_0389: Unknown result type (might be due to invalid IL or missing references)
			//IL_0395: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03be: Unknown result type (might be due to invalid IL or missing references)
			//IL_03db: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_040c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0418: Unknown result type (might be due to invalid IL or missing references)
			//IL_0435: Unknown result type (might be due to invalid IL or missing references)
			//IL_0441: Unknown result type (might be due to invalid IL or missing references)
			//IL_045e: Unknown result type (might be due to invalid IL or missing references)
			//IL_046a: Unknown result type (might be due to invalid IL or missing references)
			//IL_048f: Unknown result type (might be due to invalid IL or missing references)
			//IL_049b: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_0512: Unknown result type (might be due to invalid IL or missing references)
			//IL_051e: Unknown result type (might be due to invalid IL or missing references)
			//IL_053b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0547: Unknown result type (might be due to invalid IL or missing references)
			//IL_0564: Unknown result type (might be due to invalid IL or missing references)
			//IL_0570: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: 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_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: 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)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: 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_022e: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_027c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			foreach (PhysicalFingersController componentsInChild in ((Component)((Component)__instance).GetComponentInParent<PhysicsRig>()).GetComponentsInChildren<PhysicalFingersController>())
			{
				componentsInChild.OnApplyPoseToTransforms();
				Avatar val = lastFoundAvatars[__instance];
				if (!((Object)(object)val == (Object)null))
				{
					if ((int)componentsInChild.handedness == 1)
					{
						PhysicalFinger index = componentsInChild.index;
						val.artTransforms.leftIndexProximal.SetPositionAndRotation(index.proximalArtOffset.position, index.proximalArtOffset.rotation);
						val.artTransforms.leftIndexIntermediate.SetPositionAndRotation(index.intermediateArtOffset.position, index.intermediateArtOffset.rotation);
						val.artTransforms.leftIndexDistal.SetPositionAndRotation(index.distalArtOffset.position, index.distalArtOffset.rotation);
						index = componentsInChild.middle;
						val.artTransforms.leftMiddleProximal.SetPositionAndRotation(index.proximalArtOffset.position, index.proximalArtOffset.rotation);
						val.artTransforms.leftMiddleIntermediate.SetPositionAndRotation(index.intermediateArtOffset.position, index.intermediateArtOffset.rotation);
						val.artTransforms.leftMiddleDistal.SetPositionAndRotation(index.distalArtOffset.position, index.distalArtOffset.rotation);
						index = componentsInChild.ring;
						val.artTransforms.leftRingProximal.SetPositionAndRotation(index.proximalArtOffset.position, index.proximalArtOffset.rotation);
						val.artTransforms.leftRingIntermediate.SetPositionAndRotation(index.intermediateArtOffset.position, index.intermediateArtOffset.rotation);
						val.artTransforms.leftRingDistal.SetPositionAndRotation(index.distalArtOffset.position, index.distalArtOffset.rotation);
						index = componentsInChild.pinky;
						val.artTransforms.leftLittleProximal.SetPositionAndRotation(index.proximalArtOffset.position, index.proximalArtOffset.rotation);
						val.artTransforms.leftLittleIntermediate.SetPositionAndRotation(index.intermediateArtOffset.position, index.intermediateArtOffset.rotation);
						val.artTransforms.leftLittleDistal.SetPositionAndRotation(index.distalArtOffset.position, index.distalArtOffset.rotation);
						index = componentsInChild.thumb;
						val.artTransforms.leftThumbProximal.SetPositionAndRotation(index.proximalArtOffset.position, index.proximalArtOffset.rotation);
						val.artTransforms.leftThumbIntermediate.SetPositionAndRotation(index.intermediateArtOffset.position, index.intermediateArtOffset.rotation);
						val.artTransforms.leftThumbDistal.SetPositionAndRotation(index.distalArtOffset.position, index.distalArtOffset.rotation);
					}
					else
					{
						PhysicalFinger index2 = componentsInChild.index;
						val.artTransforms.rightIndexProximal.SetPositionAndRotation(index2.proximalArtOffset.position, index2.proximalArtOffset.rotation);
						val.artTransforms.rightIndexIntermediate.SetPositionAndRotation(index2.intermediateArtOffset.position, index2.intermediateArtOffset.rotation);
						val.artTransforms.rightIndexDistal.SetPositionAndRotation(index2.distalArtOffset.position, index2.distalArtOffset.rotation);
						index2 = componentsInChild.middle;
						val.artTransforms.rightMiddleProximal.SetPositionAndRotation(index2.proximalArtOffset.position, index2.proximalArtOffset.rotation);
						val.artTransforms.rightMiddleIntermediate.SetPositionAndRotation(index2.intermediateArtOffset.position, index2.intermediateArtOffset.rotation);
						val.artTransforms.rightMiddleDistal.SetPositionAndRotation(index2.distalArtOffset.position, index2.distalArtOffset.rotation);
						index2 = componentsInChild.ring;
						val.artTransforms.rightRingProximal.SetPositionAndRotation(index2.proximalArtOffset.position, index2.proximalArtOffset.rotation);
						val.artTransforms.rightRingIntermediate.SetPositionAndRotation(index2.intermediateArtOffset.position, index2.intermediateArtOffset.rotation);
						val.artTransforms.rightRingDistal.SetPositionAndRotation(index2.distalArtOffset.position, index2.distalArtOffset.rotation);
						index2 = componentsInChild.pinky;
						val.artTransforms.rightLittleProximal.SetPositionAndRotation(index2.proximalArtOffset.position, index2.proximalArtOffset.rotation);
						val.artTransforms.rightLittleIntermediate.SetPositionAndRotation(index2.intermediateArtOffset.position, index2.intermediateArtOffset.rotation);
						val.artTransforms.rightLittleDistal.SetPositionAndRotation(index2.distalArtOffset.position, index2.distalArtOffset.rotation);
						index2 = componentsInChild.thumb;
						val.artTransforms.rightThumbProximal.SetPositionAndRotation(index2.proximalArtOffset.position, index2.proximalArtOffset.rotation);
						val.artTransforms.rightThumbIntermediate.SetPositionAndRotation(index2.intermediateArtOffset.position, index2.intermediateArtOffset.rotation);
						val.artTransforms.rightThumbDistal.SetPositionAndRotation(index2.distalArtOffset.position, index2.distalArtOffset.rotation);
					}
				}
			}
		}

		[HarmonyPatch("SetArtOutputAvatar")]
		[HarmonyPostfix]
		public static void SetAvatarPostfix(ArtRig __instance, Avatar avatar)
		{
			lastFoundAvatars[__instance] = avatar;
			foreach (PhysicalFingersController componentsInChild in ((Component)((Component)__instance).GetComponentInParent<PhysicsRig>()).GetComponentsInChildren<PhysicalFingersController>())
			{
				componentsInChild.OnAvatarSwapped(avatar);
			}
		}
	}
	[HarmonyPatch(typeof(PhysicsRig))]
	public static class PhysRigPatches
	{
		[HarmonyPatch("OnAwake")]
		[HarmonyPostfix]
		public static void OnAwake(PhysicsRig __instance)
		{
			if (Bone_Menu_Creator.ModEnabled)
			{
				PhysicalFingersController.CreatePhysicalFingers(__instance.leftHand.physHand);
				PhysicalFingersController.CreatePhysicalFingers(__instance.rightHand.physHand);
			}
		}
	}
	public class Bone_Menu_Creator
	{
		private static MelonPreferences_Category category;

		private static MelonPreferences_Entry<bool> modEnabled;

		public static bool ModEnabled => modEnabled.Value;

		public static void OnInitialize()
		{
			category = MelonPreferences.CreateCategory("FingerPhysics");
			modEnabled = category.CreateEntry<bool>("Enabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
			CreateBoneMenu();
		}

		public static void CreateBoneMenu()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			Page val = Page.Root.CreatePage("Finger Physics", Color.white, 0, true);
			val.CreateBool("Physics Fingers Enabled", Color.white, modEnabled.Value, (Action<bool>)delegate(bool b)
			{
				modEnabled.Value = b;
				MelonPreferences.Save();
			});
		}
	}
	public class Main : MelonMod
	{
		public override void OnInitializeMelon()
		{
			Bone_Menu_Creator.OnInitialize();
		}
	}
	[RegisterTypeInIl2Cpp]
	public class PhysicalFinger : MonoBehaviour
	{
		public const float fingerSectionMass = 0.5f;

		private PhysicalFingersController _controller;

		public Rigidbody handBodyReference;

		public Transform proximalTarget;

		public Rigidbody proximalBody;

		public CapsuleCollider proximalCol;

		public ConfigurableJoint proximalJoint;

		public Transform proximalArtOffset;

		public Transform intermediateTarget;

		public Rigidbody intermediateBody;

		public CapsuleCollider intermediateCol;

		public ConfigurableJoint intermediateJoint;

		public Transform intermediateArtOffset;

		public Transform distalTarget;

		public Rigidbody distalBody;

		public CapsuleCollider distalCol;

		public ConfigurableJoint distalJoint;

		public Transform distalArtOffset;

		public PhysicalFingersController controllerReference
		{
			get
			{
				if (_controller == null)
				{
					_controller = ((Component)this).GetComponentInParent<PhysicalFingersController>();
				}
				return _controller;
			}
		}

		private Quaternion handChildOffsetRotation => ((int)controllerReference.handedness == 1) ? Quaternion.Euler(270f, 90f, 0f) : Quaternion.Euler(90f, 270f, 0f);

		public static PhysicalFinger CreateFinger(PhysHand handBody, Transform proxTarget, Transform intTarget, Transform distTarget, string name, Transform parent)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0302: Unknown result type (might be due to invalid IL or missing references)
			//IL_030c: Unknown result type (might be due to invalid IL or missing references)
			//IL_031d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0323: 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_032e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0333: Unknown result type (might be due to invalid IL or missing references)
			//IL_0339: Unknown result type (might be due to invalid IL or missing references)
			//IL_033e: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03dd: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			PhysicalFinger physicalFinger = val.AddComponent<PhysicalFinger>();
			val.transform.SetParent(parent);
			physicalFinger.proximalTarget = proxTarget;
			physicalFinger.intermediateTarget = intTarget;
			physicalFinger.distalTarget = distTarget;
			PhysicalFinger physicalFinger2 = physicalFinger;
			PhysicalFinger physicalFinger3 = physicalFinger;
			PhysicalFinger physicalFinger4 = physicalFinger;
			Rigidbody rbHand = handBody.rbHand;
			Vector3 localPosition = intTarget.localPosition;
			(GameObject, Rigidbody, CapsuleCollider, ConfigurableJoint, Transform) tuple = CreateFingerBone("Proximal", rbHand, proxTarget, ((Vector3)(ref localPosition)).magnitude, 0.01f, intTarget.localPosition / 2f, rotOverride: true, handBody.rbHand.rotation * physicalFinger.handChildOffsetRotation);
			physicalFinger.proximalBody = tuple.Item2;
			physicalFinger2.proximalCol = tuple.Item3;
			physicalFinger3.proximalJoint = tuple.Item4;
			physicalFinger4.proximalArtOffset = tuple.Item5;
			((Joint)physicalFinger.proximalJoint).axis = Vector3.right;
			physicalFinger.proximalJoint.angularXMotion = (ConfigurableJointMotion)1;
			ConfigurableJoint obj = physicalFinger.proximalJoint;
			SoftJointLimit val2 = default(SoftJointLimit);
			((SoftJointLimit)(ref val2)).limit = 25f;
			((SoftJointLimit)(ref val2)).bounciness = 0f;
			((SoftJointLimit)(ref val2)).contactDistance = 0f;
			obj.highAngularXLimit = val2;
			ConfigurableJoint obj2 = physicalFinger.proximalJoint;
			val2 = default(SoftJointLimit);
			((SoftJointLimit)(ref val2)).limit = -25f;
			((SoftJointLimit)(ref val2)).bounciness = 0f;
			((SoftJointLimit)(ref val2)).contactDistance = 0f;
			obj2.lowAngularXLimit = val2;
			ConfigurableJoint obj3 = physicalFinger.proximalJoint;
			JointDrive slerpDrive = default(JointDrive);
			((JointDrive)(ref slerpDrive)).positionSpring = 2000f;
			((JointDrive)(ref slerpDrive)).positionDamper = 200f;
			JointDrive slerpDrive2 = physicalFinger.proximalJoint.slerpDrive;
			((JointDrive)(ref slerpDrive)).maximumForce = ((JointDrive)(ref slerpDrive2)).maximumForce;
			obj3.slerpDrive = slerpDrive;
			physicalFinger4 = physicalFinger;
			physicalFinger3 = physicalFinger;
			physicalFinger2 = physicalFinger;
			Rigidbody jointedBody2 = physicalFinger.proximalBody;
			localPosition = distTarget.localPosition;
			tuple = CreateFingerBone("Intermediate", jointedBody2, intTarget, ((Vector3)(ref localPosition)).magnitude, 0.01f, distTarget.localPosition / 2f, rotOverride: true, handBody.rbHand.rotation * physicalFinger.handChildOffsetRotation * intTarget.localRotation);
			physicalFinger.intermediateBody = tuple.Item2;
			physicalFinger4.intermediateCol = tuple.Item3;
			physicalFinger3.intermediateJoint = tuple.Item4;
			physicalFinger2.intermediateArtOffset = tuple.Item5;
			physicalFinger.intermediateJoint.angularXMotion = (ConfigurableJointMotion)1;
			physicalFinger.intermediateJoint.angularYMotion = (ConfigurableJointMotion)0;
			physicalFinger.intermediateJoint.angularZMotion = (ConfigurableJointMotion)0;
			ConfigurableJoint obj4 = physicalFinger.intermediateJoint;
			val2 = default(SoftJointLimit);
			((SoftJointLimit)(ref val2)).limit = 120f;
			((SoftJointLimit)(ref val2)).bounciness = 0f;
			((SoftJointLimit)(ref val2)).contactDistance = 0f;
			obj4.highAngularXLimit = val2;
			physicalFinger2 = physicalFinger;
			physicalFinger3 = physicalFinger;
			physicalFinger4 = physicalFinger;
			Rigidbody jointedBody3 = physicalFinger.intermediateBody;
			localPosition = distTarget.localPosition;
			tuple = CreateFingerBone("Distal", jointedBody3, distTarget, ((Vector3)(ref localPosition)).magnitude, 0.01f, distTarget.localPosition / 2f, rotOverride: true, handBody.rbHand.rotation * physicalFinger.handChildOffsetRotation * intTarget.localRotation * distTarget.localRotation);
			physicalFinger.distalBody = tuple.Item2;
			physicalFinger2.distalCol = tuple.Item3;
			physicalFinger3.distalJoint = tuple.Item4;
			physicalFinger4.distalArtOffset = tuple.Item5;
			physicalFinger.distalJoint.angularXMotion = (ConfigurableJointMotion)1;
			physicalFinger.distalJoint.angularYMotion = (ConfigurableJointMotion)0;
			physicalFinger.distalJoint.angularZMotion = (ConfigurableJointMotion)0;
			ConfigurableJoint obj5 = physicalFinger.distalJoint;
			val2 = default(SoftJointLimit);
			((SoftJointLimit)(ref val2)).limit = 120f;
			((SoftJointLimit)(ref val2)).bounciness = 0f;
			((SoftJointLimit)(ref val2)).contactDistance = 0f;
			obj5.highAngularXLimit = val2;
			physicalFinger.UpdateFingerAnchors();
			return physicalFinger;
			static CapsuleCollider CreateCollider(GameObject gobj, int direction, float radius, float height, Vector3 center)
			{
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				CapsuleCollider val3 = gobj.AddComponent<CapsuleCollider>();
				val3.direction = direction;
				val3.radius = radius;
				val3.height = height;
				val3.center = center;
				return val3;
			}
			(GameObject, Rigidbody, CapsuleCollider, ConfigurableJoint, Transform) CreateFingerBone(string extraName, Rigidbody jointedBody, Transform targetTransform, float boneLength, float boneRadius, Vector3 boneColliderCenter, bool rotOverride = false, Quaternion overrideQ = default(Quaternion))
			{
				//IL_0013: Unknown result type (might be due to invalid IL or missing references)
				//IL_0019: Expected O, but got Unknown
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				//IL_008f: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d6: 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_0100: Unknown result type (might be due to invalid IL or missing references)
				//IL_0123: Unknown result type (might be due to invalid IL or missing references)
				//IL_0128: Unknown result type (might be due to invalid IL or missing references)
				//IL_0137: Unknown result type (might be due to invalid IL or missing references)
				//IL_0164: Unknown result type (might be due to invalid IL or missing references)
				//IL_016b: Expected O, but got Unknown
				//IL_0185: Unknown result type (might be due to invalid IL or missing references)
				//IL_0197: Unknown result type (might be due to invalid IL or missing references)
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				GameObject val4 = new GameObject(name + " " + extraName);
				val4.transform.SetParent(parent);
				val4.transform.position = targetTransform.position;
				val4.transform.rotation = targetTransform.rotation;
				if (rotOverride)
				{
					val4.transform.rotation = overrideQ;
				}
				val4.layer = 8;
				Rigidbody val5 = val4.AddComponent<Rigidbody>();
				val5.mass = 0.5f;
				CapsuleCollider val6 = CreateCollider(val4, 0, boneRadius, boneLength + 2f * boneRadius, boneColliderCenter);
				Physics.IgnoreCollision((Collider)(object)val6, (Collider)(object)handBody.fingersCol, true);
				Physics.IgnoreCollision((Collider)(object)val6, (Collider)(object)handBody.handCol, true);
				ConfigurableJoint val7 = val4.AddComponent<ConfigurableJoint>();
				((Joint)val7).connectedBody = jointedBody;
				LockMotion(val7);
				((Joint)val7).anchor = Vector3.zero;
				((Joint)val7).autoConfigureConnectedAnchor = false;
				((Joint)val7).axis = Vector3.back;
				val7.rotationDriveMode = (RotationDriveMode)1;
				JointDrive slerpDrive3 = default(JointDrive);
				((JointDrive)(ref slerpDrive3)).positionSpring = 1000f;
				((JointDrive)(ref slerpDrive3)).positionDamper = 50f;
				JointDrive slerpDrive4 = val7.slerpDrive;
				((JointDrive)(ref slerpDrive3)).maximumForce = ((JointDrive)(ref slerpDrive4)).maximumForce;
				val7.slerpDrive = slerpDrive3;
				val7.projectionMode = (JointProjectionMode)1;
				val7.projectionDistance = 0f;
				val7.projectionAngle = 0f;
				GameObject val8 = new GameObject("artOffset");
				val8.transform.SetParent(val4.transform);
				val8.transform.localPosition = Vector3.zero;
				val8.transform.localRotation = Quaternion.identity;
				return (val4, val5, val6, val7, val8.transform);
			}
			static void LockMotion(ConfigurableJoint joint)
			{
				joint.xMotion = (ConfigurableJointMotion)0;
				joint.yMotion = (ConfigurableJointMotion)0;
				joint.zMotion = (ConfigurableJointMotion)0;
			}
		}

		public static void IgnoreFingers(PhysicalFinger finger1, PhysicalFinger finger2)
		{
			Physics.IgnoreCollision((Collider)(object)finger1.proximalCol, (Collider)(object)finger2.proximalCol);
			Physics.IgnoreCollision((Collider)(object)finger1.proximalCol, (Collider)(object)finger2.intermediateCol);
			Physics.IgnoreCollision((Collider)(object)finger1.proximalCol, (Collider)(object)finger2.distalCol);
			Physics.IgnoreCollision((Collider)(object)finger1.intermediateCol, (Collider)(object)finger2.proximalCol);
			Physics.IgnoreCollision((Collider)(object)finger1.intermediateCol, (Collider)(object)finger2.intermediateCol);
			Physics.IgnoreCollision((Collider)(object)finger1.intermediateCol, (Collider)(object)finger2.distalCol);
			Physics.IgnoreCollision((Collider)(object)finger1.distalCol, (Collider)(object)finger2.proximalCol);
			Physics.IgnoreCollision((Collider)(object)finger1.distalCol, (Collider)(object)finger2.intermediateCol);
			Physics.IgnoreCollision((Collider)(object)finger1.distalCol, (Collider)(object)finger2.distalCol);
		}

		public void SetCollisions(bool enabled)
		{
			proximalBody.detectCollisions = enabled;
			intermediateBody.detectCollisions = enabled;
			distalBody.detectCollisions = enabled;
		}

		public void UpdateFingerAnchors()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Invalid comparison between Unknown and I4
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: 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_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			((Joint)proximalJoint).connectedAnchor = (((int)controllerReference.handedness == 1) ? (Quaternion.Euler(270f, 90f, 0f) * proximalTarget.localPosition) : (Quaternion.Euler(90f, 270f, 0f) * proximalTarget.localPosition));
			proximalCol.center = intermediateTarget.localPosition / 2f;
			CapsuleCollider obj = proximalCol;
			Vector3 localPosition = intermediateTarget.localPosition;
			obj.height = ((Vector3)(ref localPosition)).magnitude + 0.02f;
			((Joint)intermediateJoint).connectedAnchor = intermediateTarget.localPosition;
			intermediateCol.center = distalTarget.localPosition / 2f;
			CapsuleCollider obj2 = intermediateCol;
			localPosition = distalTarget.localPosition;
			obj2.height = ((Vector3)(ref localPosition)).magnitude + 0.02f;
			((Joint)distalJoint).connectedAnchor = distalTarget.localPosition;
			distalCol.center = distalTarget.localPosition / 2f;
			CapsuleCollider obj3 = distalCol;
			localPosition = distalTarget.localPosition;
			obj3.height = ((Vector3)(ref localPosition)).magnitude + 0.02f;
		}

		public void UpdateArtTransforms(Transform proximal, Transform intermediate, Transform distal)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			proximalArtOffset.localPosition = proximal.localPosition;
			proximalArtOffset.localRotation = proximal.localRotation;
			intermediateArtOffset.localPosition = intermediate.localPosition;
			intermediateArtOffset.localRotation = intermediate.localRotation;
			distalArtOffset.localPosition = distal.localPosition;
			distalArtOffset.localRotation = distal.localRotation;
		}

		public void UpdateJointTargets()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			proximalJoint.targetRotation = Quaternion.Inverse(proximalTarget.localRotation);
			intermediateJoint.targetRotation = Quaternion.AngleAxis(Quaternion.Angle(Quaternion.identity, intermediateTarget.localRotation), Vector3.right);
			distalJoint.targetRotation = Quaternion.AngleAxis(Quaternion.Angle(Quaternion.identity, distalTarget.localRotation), Vector3.right);
		}
	}
	[RegisterTypeInIl2Cpp]
	public class PhysicalFingersController : MonoBehaviour
	{
		public PhysHand targetPhysHand;

		public ArtRig artOutputRig;

		public HandPoseAnimator targetHandAnimator;

		public PhysicalFinger thumb;

		public PhysicalFinger index;

		public PhysicalFinger middle;

		public PhysicalFinger ring;

		public PhysicalFinger pinky;

		private bool _previousAttachedState = false;

		public Handedness handedness => targetHandAnimator.handedness;

		public void OnAvatarSwapped(Avatar avatar)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Invalid comparison between Unknown and I4
			thumb.UpdateFingerAnchors();
			index.UpdateFingerAnchors();
			middle.UpdateFingerAnchors();
			ring.UpdateFingerAnchors();
			pinky.UpdateFingerAnchors();
			if ((int)handedness == 1)
			{
				thumb.UpdateArtTransforms(artOutputRig.artThumbLf1, artOutputRig.artThumbLf2, artOutputRig.artThumbLf3);
				index.UpdateArtTransforms(artOutputRig.artFingerLf11, artOutputRig.artFingerLf12, artOutputRig.artFingerLf13);
				middle.UpdateArtTransforms(artOutputRig.artFingerLf21, artOutputRig.artFingerLf22, artOutputRig.artFingerLf23);
				ring.UpdateArtTransforms(artOutputRig.artFingerLf31, artOutputRig.artFingerLf32, artOutputRig.artFingerLf33);
				pinky.UpdateArtTransforms(artOutputRig.artFingerLf41, artOutputRig.artFingerLf42, artOutputRig.artFingerLf43);
			}
			else
			{
				thumb.UpdateArtTransforms(artOutputRig.artThumbRt1, artOutputRig.artThumbRt2, artOutputRig.artThumbRt3);
				index.UpdateArtTransforms(artOutputRig.artFingerRt11, artOutputRig.artFingerRt12, artOutputRig.artFingerRt13);
				middle.UpdateArtTransforms(artOutputRig.artFingerRt21, artOutputRig.artFingerRt22, artOutputRig.artFingerRt23);
				ring.UpdateArtTransforms(artOutputRig.artFingerRt31, artOutputRig.artFingerRt32, artOutputRig.artFingerRt33);
				pinky.UpdateArtTransforms(artOutputRig.artFingerRt41, artOutputRig.artFingerRt42, artOutputRig.artFingerRt43);
			}
		}

		public void OnApplyPoseToTransforms()
		{
			thumb.UpdateJointTargets();
			index.UpdateJointTargets();
			middle.UpdateJointTargets();
			ring.UpdateJointTargets();
			pinky.UpdateJointTargets();
			bool flag = (Object)(object)targetPhysHand.hand.AttachedReceiver != (Object)null;
			bool flag2 = (Object)(object)targetPhysHand.hand.HoveringReceiver != (Object)null;
			bool flag3 = flag || flag2;
			if (_previousAttachedState != ((Object)(object)targetPhysHand.hand.AttachedReceiver != (Object)null))
			{
				_previousAttachedState = (Object)(object)targetPhysHand.hand.AttachedReceiver != (Object)null || (Object)(object)targetPhysHand.hand.HoveringReceiver != (Object)null;
				thumb.SetCollisions(!_previousAttachedState);
				index.SetCollisions(!_previousAttachedState);
				middle.SetCollisions(!_previousAttachedState);
				ring.SetCollisions(!_previousAttachedState);
				pinky.SetCollisions(!_previousAttachedState);
			}
		}

		public static PhysicalFingersController CreatePhysicalFingers(PhysHand physHand)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Invalid comparison between Unknown and I4
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			GameObject val = new GameObject("PhysicalFingers Controller (" + (((int)physHand.hand.handedness == 1) ? "Left" : "Right") + ")");
			PhysicalFingersController physicalFingersController = val.AddComponent<PhysicalFingersController>();
			val.transform.SetParent(((Component)physHand.physBody).transform);
			physicalFingersController.targetPhysHand = physHand;
			HandPoseAnimator val2 = (physicalFingersController.targetHandAnimator = physHand.hand.Animator);
			physicalFingersController.artOutputRig = physHand.physBody.artOutput;
			physicalFingersController.thumb = PhysicalFinger.CreateFinger(physHand, val2.thumb1, val2.thumb2, val2.thumb3, "Thumb", ((Component)physicalFingersController).transform);
			physicalFingersController.index = PhysicalFinger.CreateFinger(physHand, val2.index1, val2.index2, val2.index3, "Index", ((Component)physicalFingersController).transform);
			physicalFingersController.middle = PhysicalFinger.CreateFinger(physHand, val2.middle1, val2.middle2, val2.middle3, "Middle", ((Component)physicalFingersController).transform);
			physicalFingersController.ring = PhysicalFinger.CreateFinger(physHand, val2.ring1, val2.ring2, val2.ring3, "Ring", ((Component)physicalFingersController).transform);
			physicalFingersController.pinky = PhysicalFinger.CreateFinger(physHand, val2.pinky1, val2.pinky2, val2.pinky3, "Pinky", ((Component)physicalFingersController).transform);
			physicalFingersController.thumb.proximalJoint.angularXMotion = (ConfigurableJointMotion)2;
			physicalFingersController.thumb.proximalJoint.angularYMotion = (ConfigurableJointMotion)2;
			physicalFingersController.thumb.proximalJoint.angularZMotion = (ConfigurableJointMotion)2;
			PhysicalFinger.IgnoreFingers(physicalFingersController.index, physicalFingersController.middle);
			PhysicalFinger.IgnoreFingers(physicalFingersController.index, physicalFingersController.ring);
			PhysicalFinger.IgnoreFingers(physicalFingersController.index, physicalFingersController.pinky);
			PhysicalFinger.IgnoreFingers(physicalFingersController.index, physicalFingersController.thumb);
			PhysicalFinger.IgnoreFingers(physicalFingersController.middle, physicalFingersController.ring);
			PhysicalFinger.IgnoreFingers(physicalFingersController.middle, physicalFingersController.pinky);
			PhysicalFinger.IgnoreFingers(physicalFingersController.middle, physicalFingersController.thumb);
			PhysicalFinger.IgnoreFingers(physicalFingersController.ring, physicalFingersController.pinky);
			PhysicalFinger.IgnoreFingers(physicalFingersController.ring, physicalFingersController.thumb);
			PhysicalFinger.IgnoreFingers(physicalFingersController.pinky, physicalFingersController.thumb);
			return physicalFingersController;
		}
	}
	internal class BuildInfo
	{
		internal const string Name = "Finger Physics";

		internal const string Description = "Adds Physical Fingers to the RigManager";

		internal const string Author = "EvroDev";

		internal const string Company = "";

		internal const string Version = "1.0.0";

		internal const string DownloadLink = "";
	}
}