Decompiled source of PhysicsFingers v1.2.1

Mods/FingerPhysics.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BoneLib;
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.2.1", "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+e44bf3f664cb2b6982d03f2f22a16a2093ef5c89")]
[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
{
	public class BitsAndBobs
	{
		public bool inRangeOfPlayer = true;

		public Avatar lastSetAvatar;

		public PhysicalFingersController leftHandFingers;

		public PhysicalFingersController rightHandFingers;
	}
	[HarmonyPatch(typeof(ArtRig))]
	public static class ArtOutputUpdatePatch
	{
		public static Dictionary<int, BitsAndBobs> artRigToUsefulReferences = new Dictionary<int, BitsAndBobs>();

		public static bool TryGetReferences(ArtRig artRig, out BitsAndBobs references)
		{
			return artRigToUsefulReferences.TryGetValue(((Object)artRig).GetInstanceID(), out references);
		}

		[HarmonyPatch("ArtOutputLateUpdate")]
		[HarmonyPostfix]
		public static void LateUpdatePostfix(ArtRig __instance)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			if (!TryGetReferences(__instance, out var references))
			{
				return;
			}
			float num = Vector3.Distance(__instance.artHead.position, Player.Head.position);
			bool flag = num < 10f;
			if (references.inRangeOfPlayer != flag)
			{
				references.inRangeOfPlayer = flag;
				references.leftHandFingers.OnPlayerRangeChanged(references.inRangeOfPlayer);
				references.rightHandFingers.OnPlayerRangeChanged(references.inRangeOfPlayer);
			}
			if (references.inRangeOfPlayer)
			{
				references.leftHandFingers.OnApplyPoseToTransforms();
				references.rightHandFingers.OnApplyPoseToTransforms();
				if (!((Object)(object)references.lastSetAvatar == (Object)null))
				{
					Avatar lastSetAvatar = references.lastSetAvatar;
					CopyFingerToTransforms(references.leftHandFingers.index, lastSetAvatar.artTransforms.leftIndexProximal, lastSetAvatar.artTransforms.leftIndexIntermediate, lastSetAvatar.artTransforms.leftIndexDistal);
					CopyFingerToTransforms(references.leftHandFingers.middle, lastSetAvatar.artTransforms.leftMiddleProximal, lastSetAvatar.artTransforms.leftMiddleIntermediate, lastSetAvatar.artTransforms.leftMiddleDistal);
					CopyFingerToTransforms(references.leftHandFingers.ring, lastSetAvatar.artTransforms.leftRingProximal, lastSetAvatar.artTransforms.leftRingIntermediate, lastSetAvatar.artTransforms.leftRingDistal);
					CopyFingerToTransforms(references.leftHandFingers.pinky, lastSetAvatar.artTransforms.leftLittleProximal, lastSetAvatar.artTransforms.leftLittleIntermediate, lastSetAvatar.artTransforms.leftLittleDistal);
					CopyFingerToTransforms(references.leftHandFingers.thumb, lastSetAvatar.artTransforms.leftThumbProximal, lastSetAvatar.artTransforms.leftThumbIntermediate, lastSetAvatar.artTransforms.leftThumbDistal);
					CopyFingerToTransforms(references.rightHandFingers.index, lastSetAvatar.artTransforms.rightIndexProximal, lastSetAvatar.artTransforms.rightIndexIntermediate, lastSetAvatar.artTransforms.rightIndexDistal);
					CopyFingerToTransforms(references.rightHandFingers.middle, lastSetAvatar.artTransforms.rightMiddleProximal, lastSetAvatar.artTransforms.rightMiddleIntermediate, lastSetAvatar.artTransforms.rightMiddleDistal);
					CopyFingerToTransforms(references.rightHandFingers.ring, lastSetAvatar.artTransforms.rightRingProximal, lastSetAvatar.artTransforms.rightRingIntermediate, lastSetAvatar.artTransforms.rightRingDistal);
					CopyFingerToTransforms(references.rightHandFingers.pinky, lastSetAvatar.artTransforms.rightLittleProximal, lastSetAvatar.artTransforms.rightLittleIntermediate, lastSetAvatar.artTransforms.rightLittleDistal);
					CopyFingerToTransforms(references.rightHandFingers.thumb, lastSetAvatar.artTransforms.rightThumbProximal, lastSetAvatar.artTransforms.rightThumbIntermediate, lastSetAvatar.artTransforms.rightThumbDistal);
				}
			}
		}

		public static void CopyFingerToTransforms(PhysicalFinger finger, Transform proximal, Transform intermediate, Transform distal)
		{
			//IL_0013: 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)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)proximal != (Object)null)
			{
				proximal.SetPositionAndRotation(finger.proximalArtOffset.position, finger.proximalArtOffset.rotation);
			}
			if ((Object)(object)intermediate != (Object)null)
			{
				intermediate.SetPositionAndRotation(finger.intermediateArtOffset.position, finger.intermediateArtOffset.rotation);
			}
			if ((Object)(object)distal != (Object)null)
			{
				distal.SetPositionAndRotation(finger.distalArtOffset.position, finger.distalArtOffset.rotation);
			}
		}

		[HarmonyPatch("SetArtOutputAvatar")]
		[HarmonyPostfix]
		public static void SetAvatarPostfix(ArtRig __instance, Avatar avatar)
		{
			if (TryGetReferences(__instance, out var references))
			{
				references.lastSetAvatar = avatar;
				references.leftHandFingers.OnAvatarSwapped(avatar);
				references.rightHandFingers.OnAvatarSwapped(avatar);
			}
		}
	}
	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();
		}
	}
	[HarmonyPatch(typeof(FlyingGun))]
	public class NimbusGunPatches
	{
		[HarmonyPatch("EnableNoClip")]
		[HarmonyPostfix]
		public static void EnableNoClipPostfix(FlyingGun __instance)
		{
			Hand hand = __instance.triggerGrip.GetHand();
			ArtRig artOutput = hand.manager.physicsRig.artOutput;
			if (ArtOutputUpdatePatch.TryGetReferences(artOutput, out var references))
			{
				references.leftHandFingers.SetCollisions(collide: false);
				references.rightHandFingers.SetCollisions(collide: false);
			}
		}

		[HarmonyPatch("DisableNoClip")]
		[HarmonyPostfix]
		public static void DisableNoClipPostfix(FlyingGun __instance)
		{
			Hand hand = __instance.triggerGrip.GetHand();
			if (!((Object)(object)hand == (Object)null))
			{
				ArtRig artOutput = hand.manager.physicsRig.artOutput;
				if (ArtOutputUpdatePatch.TryGetReferences(artOutput, out var references) && hand.HasAttachedObject())
				{
					references.leftHandFingers.SetCollisions(!references.leftHandFingers.targetPhysHand.hand.HasAttachedObject());
					references.rightHandFingers.SetCollisions(!references.rightHandFingers.targetPhysHand.hand.HasAttachedObject());
				}
			}
		}
	}
	[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_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c6: 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_0313: Unknown result type (might be due to invalid IL or missing references)
			//IL_0318: Unknown result type (might be due to invalid IL or missing references)
			//IL_0327: Unknown result type (might be due to invalid IL or missing references)
			//IL_0331: Unknown result type (might be due to invalid IL or missing references)
			//IL_0342: Unknown result type (might be due to invalid IL or missing references)
			//IL_0348: Unknown result type (might be due to invalid IL or missing references)
			//IL_034d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ec: 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_0429: 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;
			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 = 5000f;
			((JointDrive)(ref slerpDrive)).positionDamper = 100f;
			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);
			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;
			ConfigurableJoint obj5 = physicalFinger.intermediateJoint;
			val2 = default(SoftJointLimit);
			((SoftJointLimit)(ref val2)).limit = -10f;
			((SoftJointLimit)(ref val2)).bounciness = 0f;
			((SoftJointLimit)(ref val2)).contactDistance = 0f;
			obj5.lowAngularXLimit = 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);
			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 obj6 = physicalFinger.distalJoint;
			val2 = default(SoftJointLimit);
			((SoftJointLimit)(ref val2)).limit = 120f;
			((SoftJointLimit)(ref val2)).bounciness = 0f;
			((SoftJointLimit)(ref val2)).contactDistance = 0f;
			obj6.highAngularXLimit = val2;
			ConfigurableJoint obj7 = physicalFinger.distalJoint;
			val2 = default(SoftJointLimit);
			((SoftJointLimit)(ref val2)).limit = -10f;
			((SoftJointLimit)(ref val2)).bounciness = 0f;
			((SoftJointLimit)(ref val2)).contactDistance = 0f;
			obj7.lowAngularXLimit = 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 = 2000f;
				((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;

		private float _timeSinceLastRelease = 0f;

		private bool _waitingToEnableCollisions = false;

		public Handedness handedness => targetHandAnimator.handedness;

		private void Update()
		{
			_timeSinceLastRelease += Time.deltaTime;
			if (_timeSinceLastRelease > 0.5f && _waitingToEnableCollisions)
			{
				SetCollisions(collide: true);
				_waitingToEnableCollisions = false;
			}
		}

		public void OnGrabbedInteractable()
		{
			SetCollisions(collide: false);
			_waitingToEnableCollisions = false;
		}

		public void OnReleasedInteractable()
		{
			_timeSinceLastRelease = 0f;
			_waitingToEnableCollisions = true;
		}

		public void SetCollisions(bool collide)
		{
			thumb.SetCollisions(collide);
			index.SetCollisions(collide);
			middle.SetCollisions(collide);
			ring.SetCollisions(collide);
			pinky.SetCollisions(collide);
		}

		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;
			if (_previousAttachedState != targetPhysHand.hand.HasAttachedObject())
			{
				_previousAttachedState = targetPhysHand.hand.HasAttachedObject();
				if (_previousAttachedState)
				{
					OnGrabbedInteractable();
				}
				else
				{
					OnReleasedInteractable();
				}
			}
		}

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

		public void OnPlayerRangeChanged(bool inRangeOfPlayer)
		{
		}
	}
	[HarmonyPatch(typeof(PhysicsRig))]
	public static class PhysRigPatches
	{
		[HarmonyPatch("OnAwake")]
		[HarmonyPostfix]
		public static void OnAwake(PhysicsRig __instance)
		{
			if (Bone_Menu_Creator.ModEnabled)
			{
				BitsAndBobs bitsAndBobs = new BitsAndBobs();
				bitsAndBobs.leftHandFingers = PhysicalFingersController.CreatePhysicalFingers(__instance.leftHand.physHand);
				bitsAndBobs.rightHandFingers = PhysicalFingersController.CreatePhysicalFingers(__instance.rightHand.physHand);
				int instanceID = ((Object)__instance.artOutput).GetInstanceID();
				ArtOutputUpdatePatch.artRigToUsefulReferences.Add(instanceID, bitsAndBobs);
			}
		}
	}
	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.2.1";

		internal const string DownloadLink = "";
	}
}