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 artRigToUsefulReferences = new Dictionary(); 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 modEnabled; public static bool ModEnabled => modEnabled.Value; public static void OnInitialize() { category = MelonPreferences.CreateCategory("FingerPhysics"); modEnabled = category.CreateEntry("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)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(); } 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(); 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(); 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(); 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(); ((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(); 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 = ""; } }