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