diff --git a/README.md b/README.md index 4ebec99..b1169e0 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,10 @@ Merged set of MelonLoader mods for ChilloutVR. | [Desktop Head Tracking](/ml_dht/README.md)| ml_dht | - | ✔ Yes
:warning:Broken | | [Desktop Reticle Switch](/ml_drs/README.md)| ml_drs | 1.0.1 [:arrow_down:](../../releases/latest/download/ml_drs.dll)| ✔ Yes | | [Extended Game Notifications](/ml_egn/README.md) | ml_egn | 1.0.3 [:arrow_down:](../../releases/latest/download/ml_egn.dll)| ✔ Yes | -| [Leap Motion Extension](/ml_lme/README.md)| ml_lme | 1.4.0 [:arrow_down:](../../releases/latest/download/ml_lme.dll)| ✔ Yes | +| [Leap Motion Extension](/ml_lme/README.md)| ml_lme | 1.4.1 [:arrow_down:](../../releases/latest/download/ml_lme.dll)| ✔ Yes
:hourglass_flowing_sand: Update review | | [Pickup Arm Movement](/ml_pam/README.md)| ml_pam | 1.0.6 [:arrow_down:](../../releases/latest/download/ml_pam.dll)| ✔ Yes | -| [Player Movement Copycat](/ml_pmc/README.md)| ml_pmc | 1.0.1 [:arrow_down:](../../releases/latest/download/ml_pmc.dll)| ✔ Yes | -| [Player Ragdoll Mod](/ml_prm/README.md)| ml_prm | 1.0.6 [:arrow_down:](../../releases/latest/download/ml_prm.dll)| ✔ Yes | +| [Player Movement Copycat](/ml_pmc/README.md)| ml_pmc | 1.0.2 [:arrow_down:](../../releases/latest/download/ml_pmc.dll)| ✔ Yes
:hourglass_flowing_sand: Update review | +| [Player Ragdoll Mod](/ml_prm/README.md)| ml_prm | 1.0.7 [:arrow_down:](../../releases/latest/download/ml_prm.dll)| ✔ Yes
:hourglass_flowing_sand: Update review | **Archived mods:** | Full name | Short name | Notes | diff --git a/ml_lme/LeapInput.cs b/ml_lme/LeapInput.cs index 560f067..dc92f64 100644 --- a/ml_lme/LeapInput.cs +++ b/ml_lme/LeapInput.cs @@ -123,7 +123,7 @@ namespace ml_lme { if(base.InputEnabled) { - GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); + LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData(); if(l_data.m_leftHand.m_present) { @@ -265,7 +265,7 @@ namespace ml_lme { if(Settings.Input) { - GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); + LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData(); if(l_data.m_leftHand.m_present && (!m_inVR || !Utils.IsLeftHandTracked() || !Settings.FingersOnly)) { @@ -391,8 +391,10 @@ namespace ml_lme } } - void SetFingersInput(GestureMatcher.HandData p_hand, bool p_left) + void SetFingersInput(LeapParser.HandData p_hand, bool p_left) { + // Game has spreads in range of [0;1], but mod now operates in range of [-1;1] + // So spreads will be normalized towards game's range if(p_left) { _inputManager.fingerCurlLeftThumb = p_hand.m_bends[0]; @@ -400,11 +402,11 @@ namespace ml_lme _inputManager.fingerCurlLeftMiddle = p_hand.m_bends[2]; _inputManager.fingerCurlLeftRing = p_hand.m_bends[3]; _inputManager.fingerCurlLeftPinky = p_hand.m_bends[4]; - _inputManager.fingerSpreadLeftThumb = p_hand.m_spreads[0]; - _inputManager.fingerSpreadLeftIndex = p_hand.m_spreads[1]; - _inputManager.fingerSpreadLeftMiddle = p_hand.m_spreads[2]; - _inputManager.fingerSpreadLeftRing = p_hand.m_spreads[3]; - _inputManager.fingerSpreadLeftPinky = p_hand.m_spreads[4]; + _inputManager.fingerSpreadLeftThumb = 1f - (p_hand.m_spreads[0] * 0.5f + 0.5f); + _inputManager.fingerSpreadLeftIndex = 1f - (p_hand.m_spreads[1] * 0.5f + 0.5f); + _inputManager.fingerSpreadLeftMiddle = 1f - (p_hand.m_spreads[2] * 0.5f + 0.5f); + _inputManager.fingerSpreadLeftRing = 1f - (p_hand.m_spreads[3] * 0.5f + 0.5f); + _inputManager.fingerSpreadLeftPinky = 1f - (p_hand.m_spreads[4] * 0.5f + 0.5f); } else { @@ -413,11 +415,11 @@ namespace ml_lme _inputManager.fingerCurlRightMiddle = p_hand.m_bends[2]; _inputManager.fingerCurlRightRing = p_hand.m_bends[3]; _inputManager.fingerCurlRightPinky = p_hand.m_bends[4]; - _inputManager.fingerSpreadRightThumb = p_hand.m_spreads[0]; - _inputManager.fingerSpreadRightIndex = p_hand.m_spreads[1]; - _inputManager.fingerSpreadRightMiddle = p_hand.m_spreads[2]; - _inputManager.fingerSpreadRightRing = p_hand.m_spreads[3]; - _inputManager.fingerSpreadRightPinky = p_hand.m_spreads[4]; + _inputManager.fingerSpreadRightThumb = 1f - (p_hand.m_spreads[0] * 0.5f + 0.5f); + _inputManager.fingerSpreadRightIndex = 1f - (p_hand.m_spreads[1] * 0.5f + 0.5f); + _inputManager.fingerSpreadRightMiddle = 1f - (p_hand.m_spreads[2] * 0.5f + 0.5f); + _inputManager.fingerSpreadRightRing = 1f - (p_hand.m_spreads[3] * 0.5f + 0.5f); + _inputManager.fingerSpreadRightPinky = 1f - (p_hand.m_spreads[4] * 0.5f + 0.5f); } } @@ -430,11 +432,11 @@ namespace ml_lme _inputManager.fingerCurlLeftMiddle = 0f; _inputManager.fingerCurlLeftRing = 0f; _inputManager.fingerCurlLeftPinky = 0f; - _inputManager.fingerSpreadLeftThumb = 0f; - _inputManager.fingerSpreadLeftIndex = 0f; - _inputManager.fingerSpreadLeftMiddle = 0f; - _inputManager.fingerSpreadLeftRing = 0f; - _inputManager.fingerSpreadLeftPinky = 0f; + _inputManager.fingerSpreadLeftThumb = 0.5f; + _inputManager.fingerSpreadLeftIndex = 0.5f; + _inputManager.fingerSpreadLeftMiddle = 0.5f; + _inputManager.fingerSpreadLeftRing = 0.5f; + _inputManager.fingerSpreadLeftPinky = 0.5f; } else { @@ -443,11 +445,11 @@ namespace ml_lme _inputManager.fingerCurlRightMiddle = 0f; _inputManager.fingerCurlRightRing = 0f; _inputManager.fingerCurlRightPinky = 0f; - _inputManager.fingerSpreadRightThumb = 0f; - _inputManager.fingerSpreadRightIndex = 0f; - _inputManager.fingerSpreadRightMiddle = 0f; - _inputManager.fingerSpreadRightRing = 0f; - _inputManager.fingerSpreadRightPinky = 0f; + _inputManager.fingerSpreadRightThumb = 0.5f; + _inputManager.fingerSpreadRightIndex = 0.5f; + _inputManager.fingerSpreadRightMiddle = 0.5f; + _inputManager.fingerSpreadRightRing = 0.5f; + _inputManager.fingerSpreadRightPinky = 0.5f; } } diff --git a/ml_lme/LeapManager.cs b/ml_lme/LeapManager.cs index 2819eb7..9d8733e 100644 --- a/ml_lme/LeapManager.cs +++ b/ml_lme/LeapManager.cs @@ -12,7 +12,7 @@ namespace ml_lme public static LeapManager Instance { get; private set; } = null; Leap.Controller m_leapController = null; - GestureMatcher.LeapData m_leapData = null; + LeapParser.LeapData m_leapData = null; LeapTracking m_leapTracking = null; LeapTracked m_leapTracked = null; @@ -24,7 +24,7 @@ namespace ml_lme Instance = this; m_leapController = new Leap.Controller(); - m_leapData = new GestureMatcher.LeapData(); + m_leapData = new LeapParser.LeapData(); DontDestroyOnLoad(this); @@ -90,12 +90,12 @@ namespace ml_lme if(m_leapController.IsConnected) { Leap.Frame l_frame = m_leapController.Frame(); - GestureMatcher.GetFrameData(l_frame, m_leapData); + LeapParser.ParseFrame(l_frame, m_leapData); } } } - public GestureMatcher.LeapData GetLatestData() => m_leapData; + public LeapParser.LeapData GetLatestData() => m_leapData; // Device events void OnLeapDeviceInitialized(object p_sender, Leap.DeviceEventArgs p_args) diff --git a/ml_lme/GestureMatcher.cs b/ml_lme/LeapParser.cs similarity index 67% rename from ml_lme/GestureMatcher.cs rename to ml_lme/LeapParser.cs index daa6d7e..a1ed31c 100644 --- a/ml_lme/GestureMatcher.cs +++ b/ml_lme/LeapParser.cs @@ -2,15 +2,24 @@ namespace ml_lme { - static class GestureMatcher + static class LeapParser { - readonly static Vector2[] ms_fingerLimits = + readonly static Vector2[] ms_bendLimits = { - new Vector2(-50f, 0f), - new Vector2(-20f, 30f), - new Vector2(-15f, 15f), - new Vector2(-10f, 20f), - new Vector2(-10f, 25f) + new Vector2(0f, 90f), + new Vector2(0f, 180f), + new Vector2(0f, 180f), + new Vector2(0f, 180f), + new Vector2(0f, 180f) + }; + + readonly static Vector2[] ms_spreadLimits = + { + new Vector2(-25f, 25f), // Unity's default limits + new Vector2(-20f, 20f), + new Vector2(-7.5f, 7.5f), + new Vector2(-7.5f, 7.5f), + new Vector2(-20f, 20f) }; public class HandData @@ -68,7 +77,7 @@ namespace ml_lme } } - public static void GetFrameData(Leap.Frame p_frame, LeapData p_data) + public static void ParseFrame(Leap.Frame p_frame, LeapData p_data) { p_data.Reset(); @@ -93,30 +102,31 @@ namespace ml_lme // Bends foreach(Leap.Finger l_finger in p_hand.Fingers) { - Quaternion l_prevSegment = Quaternion.identity; + Quaternion l_parentRot = Quaternion.identity; float l_angle = 0f; foreach(Leap.Bone l_bone in l_finger.bones) { - p_data.m_fingerPosition[(int)l_finger.Type * 4 + (int)l_bone.Type] = l_bone.PrevJoint; - p_data.m_fingerRotation[(int)l_finger.Type * 4 + (int)l_bone.Type] = l_bone.Rotation; + int l_index = (int)l_finger.Type * 4 + (int)l_bone.Type; + p_data.m_fingerPosition[l_index] = l_bone.PrevJoint; + p_data.m_fingerRotation[l_index] = l_bone.Rotation; if(l_bone.Type == Leap.Bone.BoneType.TYPE_METACARPAL) { - l_prevSegment = l_bone.Rotation; + l_parentRot = l_bone.Rotation; continue; } - Quaternion l_diff = Quaternion.Inverse(l_prevSegment) * l_bone.Rotation; - l_prevSegment = l_bone.Rotation; - - float l_angleDiff = l_diff.eulerAngles.x; + Quaternion l_localRot = Quaternion.Inverse(l_parentRot) * l_bone.Rotation; + float l_angleDiff = l_localRot.eulerAngles.x; if(l_angleDiff > 180f) l_angleDiff -= 360f; l_angle += l_angleDiff; + + l_parentRot = l_bone.Rotation; } - p_data.m_bends[(int)l_finger.Type] = Utils.InverseLerpUnclamped(0f, (l_finger.Type == Leap.Finger.FingerType.TYPE_THUMB) ? 90f : 180f, l_angle); + p_data.m_bends[(int)l_finger.Type] = Utils.InverseLerpUnclamped(ms_bendLimits[(int)l_finger.Type].x, ms_bendLimits[(int)l_finger.Type].y, l_angle); } // Spreads @@ -126,24 +136,17 @@ namespace ml_lme Leap.Bone l_child = l_finger.Bone(Leap.Bone.BoneType.TYPE_PROXIMAL); Quaternion l_diff = Quaternion.Inverse(l_parent.Rotation) * l_child.Rotation; - // Spread - local Y rotation, but thumb is obnoxious - float l_angle = 360f - l_diff.eulerAngles.y; + // Spread - local Y rotation + float l_angle = l_diff.eulerAngles.y; if(l_angle > 180f) l_angle -= 360f; - // Pain if(p_hand.IsRight) l_angle *= -1f; - if(l_finger.Type != Leap.Finger.FingerType.TYPE_THUMB) - { - if(l_angle < 0f) - p_data.m_spreads[(int)l_finger.Type] = 0.5f * Utils.InverseLerpUnclamped(ms_fingerLimits[(int)l_finger.Type].x, 0f, l_angle); - else - p_data.m_spreads[(int)l_finger.Type] = 0.5f + 0.5f * Utils.InverseLerpUnclamped(0f, ms_fingerLimits[(int)l_finger.Type].y, l_angle); - } - else - p_data.m_spreads[(int)l_finger.Type] = Utils.InverseLerpUnclamped(ms_fingerLimits[(int)l_finger.Type].x, ms_fingerLimits[(int)l_finger.Type].y, l_angle); + p_data.m_spreads[(int)l_finger.Type] = Utils.InverseLerpUnclamped(ms_spreadLimits[(int)l_finger.Type].x, ms_spreadLimits[(int)l_finger.Type].y, l_angle) * 2f - 1f; + if((l_finger.Type != Leap.Finger.FingerType.TYPE_THUMB) && (p_data.m_bends[(int)l_finger.Type] >= 0.8f)) + p_data.m_spreads[(int)l_finger.Type] = Mathf.Lerp(p_data.m_spreads[(int)l_finger.Type], 0f, (p_data.m_bends[(int)l_finger.Type] - 0.8f) * 5f); } p_data.m_grabStrength = Mathf.Clamp01((p_data.m_bends[1] + p_data.m_bends[2] + p_data.m_bends[3] + p_data.m_bends[4]) * 0.25f); diff --git a/ml_lme/LeapTracked.cs b/ml_lme/LeapTracked.cs index c7ff8ed..326c782 100644 --- a/ml_lme/LeapTracked.cs +++ b/ml_lme/LeapTracked.cs @@ -72,7 +72,7 @@ namespace ml_lme { if(m_enabled) { - GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); + LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData(); if((m_leftArmIK != null) && (m_rightArmIK != null)) { @@ -126,7 +126,7 @@ namespace ml_lme { if(m_enabled && !m_inVR && (m_poseHandler != null)) { - GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); + LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData(); Vector3 l_hipsLocalPos = m_hips.localPosition; Quaternion l_hipsLocalRot = m_hips.localRotation; @@ -141,62 +141,62 @@ namespace ml_lme } // Tracking update - void UpdateFingers(GestureMatcher.LeapData p_data) + void UpdateFingers(LeapParser.LeapData p_data) { if(p_data.m_leftHand.m_present) { - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb1Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_leftHand.m_bends[0])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb2Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_leftHand.m_bends[0])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb3Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_leftHand.m_bends[0])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumbSpread, Mathf.LerpUnclamped(-1.5f, 1.0f, p_data.m_leftHand.m_spreads[0])); // Ok + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb1Stretched, -0.5f-p_data.m_leftHand.m_bends[0]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb2Stretched, 0.7f - p_data.m_leftHand.m_bends[0] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb3Stretched, 0.7f - p_data.m_leftHand.m_bends[0] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumbSpread, -p_data.m_leftHand.m_spreads[0]); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[1])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[1])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[1])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndexSpread, Mathf.LerpUnclamped(1f, -1f, p_data.m_leftHand.m_spreads[1])); // Ok + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex1Stretched, 0.5f - p_data.m_leftHand.m_bends[1]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex2Stretched, 0.7f - p_data.m_leftHand.m_bends[1] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex3Stretched, 0.7f - p_data.m_leftHand.m_bends[1] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndexSpread, p_data.m_leftHand.m_spreads[1]); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[2])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[2])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[2])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddleSpread, Mathf.LerpUnclamped(2f, -2f, p_data.m_leftHand.m_spreads[2])); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle1Stretched, 0.5f - p_data.m_leftHand.m_bends[2]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle2Stretched, 0.7f - p_data.m_leftHand.m_bends[2] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle3Stretched, 0.7f - p_data.m_leftHand.m_bends[2] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddleSpread, p_data.m_leftHand.m_spreads[2]); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[3])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[3])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[3])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRingSpread, Mathf.LerpUnclamped(-2f, 2f, p_data.m_leftHand.m_spreads[3])); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing1Stretched, 0.5f - p_data.m_leftHand.m_bends[3]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing2Stretched, 0.7f - p_data.m_leftHand.m_bends[3] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing3Stretched, 0.7f - p_data.m_leftHand.m_bends[3] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRingSpread, -p_data.m_leftHand.m_spreads[3]); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[4])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[4])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[4])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittleSpread, Mathf.LerpUnclamped(-0.5f, 1f, p_data.m_leftHand.m_spreads[4])); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle1Stretched, 0.5f - p_data.m_leftHand.m_bends[4]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle2Stretched, 0.7f - p_data.m_leftHand.m_bends[4] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle3Stretched, 0.7f - p_data.m_leftHand.m_bends[4] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittleSpread, -p_data.m_leftHand.m_spreads[4]); } if(p_data.m_rightHand.m_present) { - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb1Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_rightHand.m_bends[0])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb2Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_rightHand.m_bends[0])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb3Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_rightHand.m_bends[0])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumbSpread, Mathf.LerpUnclamped(-1.5f, 1.0f, p_data.m_rightHand.m_spreads[0])); // Ok + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb1Stretched, -0.5f-p_data.m_rightHand.m_bends[0]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb2Stretched, 0.7f - p_data.m_rightHand.m_bends[0] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb3Stretched, 0.7f - p_data.m_rightHand.m_bends[0] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumbSpread, -p_data.m_rightHand.m_spreads[0]); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[1])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[1])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[1])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndexSpread, Mathf.LerpUnclamped(1f, -1f, p_data.m_rightHand.m_spreads[1])); // Ok + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex1Stretched, 0.5f - p_data.m_rightHand.m_bends[1]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex2Stretched, 0.7f - p_data.m_rightHand.m_bends[1] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex3Stretched, 0.7f - p_data.m_rightHand.m_bends[1] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndexSpread, p_data.m_rightHand.m_spreads[1]); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[2])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[2])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[2])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddleSpread, Mathf.LerpUnclamped(2f, -2f, p_data.m_rightHand.m_spreads[2])); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle1Stretched, 0.5f - p_data.m_rightHand.m_bends[2]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle2Stretched, 0.7f - p_data.m_rightHand.m_bends[2] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle3Stretched, 0.7f - p_data.m_rightHand.m_bends[2] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddleSpread, p_data.m_rightHand.m_spreads[2]); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[3])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[3])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[3])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRingSpread, Mathf.LerpUnclamped(-2f, 2f, p_data.m_rightHand.m_spreads[3])); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing1Stretched, 0.5f - p_data.m_rightHand.m_bends[3]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing2Stretched, 0.7f - p_data.m_rightHand.m_bends[3] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing3Stretched, 0.7f - p_data.m_rightHand.m_bends[3] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRingSpread, -p_data.m_rightHand.m_spreads[3]); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[4])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[4])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[4])); - UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittleSpread, Mathf.LerpUnclamped(-0.5f, 1f, p_data.m_rightHand.m_spreads[4])); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle1Stretched, 0.5f - p_data.m_rightHand.m_bends[4]); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle2Stretched, 0.7f - p_data.m_rightHand.m_bends[4] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle3Stretched, 0.7f - p_data.m_rightHand.m_bends[4] * 2f); + UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittleSpread, -p_data.m_rightHand.m_spreads[4]); } } @@ -424,6 +424,8 @@ namespace ml_lme { if(p_pose.muscles.Length > p_index) p_pose.muscles[p_index] = p_value; + + //p_pose.muscles[p_index] = (p_clamped ? Mathf.Lerp(ms_muscleLimits[p_index].x, ms_muscleLimits[p_index].y, p_value) : Mathf.LerpUnclamped(ms_muscleLimits[p_index].x, ms_muscleLimits[p_index].y, p_value)); } } } diff --git a/ml_lme/LeapTracking.cs b/ml_lme/LeapTracking.cs index 6bb9ffb..dfcfc13 100644 --- a/ml_lme/LeapTracking.cs +++ b/ml_lme/LeapTracking.cs @@ -114,7 +114,7 @@ namespace ml_lme { if(Settings.Enabled) { - GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); + LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData(); if(l_data.m_leftHand.m_present) { diff --git a/ml_lme/Properties/AssemblyInfo.cs b/ml_lme/Properties/AssemblyInfo.cs index bd17c56..8688d96 100644 --- a/ml_lme/Properties/AssemblyInfo.cs +++ b/ml_lme/Properties/AssemblyInfo.cs @@ -1,6 +1,4 @@ -using System.Reflection; - -[assembly: MelonLoader.MelonInfo(typeof(ml_lme.LeapMotionExtension), "LeapMotionExtension", "1.4.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_lme.LeapMotionExtension), "LeapMotionExtension", "1.4.1", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonOptionalDependencies("ml_pmc")] [assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] diff --git a/ml_lme/VisualHand.cs b/ml_lme/VisualHand.cs index ee7157e..1966559 100644 --- a/ml_lme/VisualHand.cs +++ b/ml_lme/VisualHand.cs @@ -47,7 +47,7 @@ namespace ml_lme } } - public void Update(GestureMatcher.HandData p_data) + public void Update(LeapParser.HandData p_data) { if(m_wrist != null) { diff --git a/ml_lme/ml_lme.csproj b/ml_lme/ml_lme.csproj index a8fe436..c872df0 100644 --- a/ml_lme/ml_lme.csproj +++ b/ml_lme/ml_lme.csproj @@ -4,7 +4,7 @@ netstandard2.1 x64 LeapMotionExtension - 1.4.0 + 1.4.1 SDraw None LeapMotionExtension diff --git a/ml_lme/resources/leapmotion_hands.asset b/ml_lme/resources/leapmotion_hands.asset index 24c8aea..e7f9e7a 100644 Binary files a/ml_lme/resources/leapmotion_hands.asset and b/ml_lme/resources/leapmotion_hands.asset differ diff --git a/ml_pmc/Main.cs b/ml_pmc/Main.cs index cccfeef..7c1826b 100644 --- a/ml_pmc/Main.cs +++ b/ml_pmc/Main.cs @@ -67,7 +67,7 @@ namespace ml_pmc if(CVRPlayerManager.Instance.GetPlayerPuppetMaster(p_id, out PuppetMaster l_puppetMaster)) { if(IsInSight(MovementSystem.Instance.proxyCollider, l_puppetMaster.GetComponent(), Utils.GetWorldMovementLimit())) - m_localCopycat.SetTarget(l_puppetMaster.gameObject); + m_localCopycat.SetTarget(l_puppetMaster); else ModUi.ShowAlert("Selected player is too far away or obstructed"); } diff --git a/ml_pmc/ModUi.cs b/ml_pmc/ModUi.cs index c537cd2..f835cfe 100644 --- a/ml_pmc/ModUi.cs +++ b/ml_pmc/ModUi.cs @@ -122,8 +122,7 @@ namespace ml_pmc // Currently broken in BTKUILib, waiting for fix static void UpdateToggleColor(bool p_state) { - //(ms_uiElements[(int)UiIndex.Toggle] as Button).ButtonIcon = (p_state ? "PMC-Dancing-On" : "PMC-Dancing"); - //(ms_uiElements[(int)UiIndex.Toggle] as Button).ButtonText = (p_state ? "PMC-Dancing-On" : "PMC-Dancing"); + (ms_uiElements[(int)UiIndex.Toggle] as Button).ButtonIcon = (p_state ? "PMC-Dancing-On" : "PMC-Dancing"); } static Stream GetIconStream(string p_name) diff --git a/ml_pmc/PoseCopycat.cs b/ml_pmc/PoseCopycat.cs index 5e0bad0..7375df9 100644 --- a/ml_pmc/PoseCopycat.cs +++ b/ml_pmc/PoseCopycat.cs @@ -49,12 +49,12 @@ namespace ml_pmc { m_sitting = (MovementSystem.Instance.lastSeat != null); - if(m_active && (m_puppetParser != null)) + if(m_active) { - OverrideIK(); - - if(m_puppetParser.HasAnimator()) + if(m_puppetParser != null) { + OverrideIK(); + bool l_mirror = Settings.MirrorPose; if(Settings.Gestures) @@ -71,6 +71,7 @@ namespace ml_pmc IKSystem.Instance.FingerSystem.controlActive = true; ref float[] l_curls = ref m_puppetParser.GetFingerCurls(); + ref float[] l_spreads = ref m_puppetParser.GetFingerSpreads(); CVRInputManager.Instance.fingerCurlLeftThumb = l_curls[l_mirror ? 5 : 0]; CVRInputManager.Instance.fingerCurlLeftIndex = l_curls[l_mirror ? 6 : 1]; @@ -82,6 +83,17 @@ namespace ml_pmc CVRInputManager.Instance.fingerCurlRightMiddle = l_curls[l_mirror ? 2 : 7]; CVRInputManager.Instance.fingerCurlRightRing = l_curls[l_mirror ? 3 : 8]; CVRInputManager.Instance.fingerCurlRightPinky = l_curls[l_mirror ? 4 : 9]; + + CVRInputManager.Instance.fingerSpreadLeftThumb = l_spreads[l_mirror ? 5 : 0]; + CVRInputManager.Instance.fingerSpreadLeftIndex = l_spreads[l_mirror ? 6 : 1]; + CVRInputManager.Instance.fingerSpreadLeftMiddle = l_spreads[l_mirror ? 7 : 2]; + CVRInputManager.Instance.fingerSpreadLeftRing = l_spreads[l_mirror ? 8 : 3]; + CVRInputManager.Instance.fingerSpreadLeftPinky = l_spreads[l_mirror ? 9 : 4]; + CVRInputManager.Instance.fingerSpreadRightThumb = l_spreads[l_mirror ? 0 : 5]; + CVRInputManager.Instance.fingerSpreadRightIndex = l_spreads[l_mirror ? 1 : 6]; + CVRInputManager.Instance.fingerSpreadRightMiddle = l_spreads[l_mirror ? 2 : 7]; + CVRInputManager.Instance.fingerSpreadRightRing = l_spreads[l_mirror ? 3 : 8]; + CVRInputManager.Instance.fingerSpreadRightPinky = l_spreads[l_mirror ? 4 : 9]; } else { @@ -92,7 +104,7 @@ namespace ml_pmc } } - Matrix4x4 l_offset = m_puppetParser.GetOffset(); + Matrix4x4 l_offset = m_puppetParser.GetLastOffset(); Vector3 l_pos = l_offset * ms_pointVector; Quaternion l_rot = l_offset.rotation; @@ -120,27 +132,26 @@ namespace ml_pmc else PlayerSetup.Instance.transform.rotation = l_result.rotation; } - } - else - { - if(!m_puppetParser.IsWaitingAnimator()) + + if(Vector3.Distance(this.transform.position, m_puppetParser.transform.position) > m_distanceLimit) SetTarget(null); } - - if(Vector3.Distance(this.transform.position, m_puppetParser.transform.position) > m_distanceLimit) + else SetTarget(null); } } void LateUpdate() { - if(m_active && (m_animator != null) && (m_puppetParser != null) && m_puppetParser.IsPoseParsed()) + if(m_active && (m_animator != null) && (m_puppetParser != null)) { OverrideIK(); m_puppetParser.GetPose().CopyTo(ref m_pose); + if(Settings.MirrorPose) Utils.MirrorPose(ref m_pose); + m_poseHandler.SetHumanPose(ref m_pose); } } @@ -160,7 +171,11 @@ namespace ml_pmc m_poseHandler?.Dispose(); m_poseHandler = null; + + if(m_active) + OnActivityChange?.Invoke(false); m_active = false; + m_distanceLimit = float.MaxValue; m_fingerTracking = false; m_pose = new HumanPose(); @@ -222,15 +237,16 @@ namespace ml_pmc } // Arbitrary - public void SetTarget(GameObject p_target) + public void SetTarget(PuppetMaster p_target) { if(m_animator != null) { if(!m_active) { - if(p_target != null) + if((p_target != null) && (p_target.animatorManager != null) && (p_target.animatorManager.animator != null) && p_target.animatorManager.animator.isHuman) { - m_puppetParser = p_target.AddComponent(); + m_puppetParser = p_target.animatorManager.animator.gameObject.AddComponent(); + m_puppetParser.m_puppetMaster = p_target; m_distanceLimit = Utils.GetWorldMovementLimit(); m_active = true; @@ -295,6 +311,17 @@ namespace ml_pmc CVRInputManager.Instance.fingerCurlRightMiddle = 0f; CVRInputManager.Instance.fingerCurlRightRing = 0f; CVRInputManager.Instance.fingerCurlRightPinky = 0f; + + CVRInputManager.Instance.fingerSpreadLeftThumb = 0.5f; + CVRInputManager.Instance.fingerSpreadLeftIndex = 0.5f; + CVRInputManager.Instance.fingerSpreadLeftMiddle = 0.5f; + CVRInputManager.Instance.fingerSpreadLeftRing = 0.5f; + CVRInputManager.Instance.fingerSpreadLeftPinky = 0.5f; + CVRInputManager.Instance.fingerSpreadRightThumb = 0.5f; + CVRInputManager.Instance.fingerSpreadRightIndex = 0.5f; + CVRInputManager.Instance.fingerSpreadRightMiddle = 0.5f; + CVRInputManager.Instance.fingerSpreadRightRing = 0.5f; + CVRInputManager.Instance.fingerSpreadRightPinky = 0.5f; } } } diff --git a/ml_pmc/Properties/AssemblyInfo.cs b/ml_pmc/Properties/AssemblyInfo.cs index e47863b..77e070e 100644 --- a/ml_pmc/Properties/AssemblyInfo.cs +++ b/ml_pmc/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ using System.Reflection; -[assembly: MelonLoader.MelonInfo(typeof(ml_pmc.PlayerMovementCopycat), "PlayerMovementCopycat", "1.0.1", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_pmc.PlayerMovementCopycat), "PlayerMovementCopycat", "1.0.2", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonPriority(3)] [assembly: MelonLoader.MelonAdditionalDependencies("BTKUILib")] diff --git a/ml_pmc/PuppetParser.cs b/ml_pmc/PuppetParser.cs index 531795a..414dd08 100644 --- a/ml_pmc/PuppetParser.cs +++ b/ml_pmc/PuppetParser.cs @@ -6,18 +6,12 @@ namespace ml_pmc [DisallowMultipleComponent] class PuppetParser : MonoBehaviour { - static readonly Vector4 ms_pointVector = new Vector4(0f, 0f, 0f, 1f); - - PuppetMaster m_puppetMaster = null; + internal PuppetMaster m_puppetMaster = null; Animator m_animator = null; AnimatorCullingMode m_cullMode; - float m_armatureScale = 1f; - float m_armatureHeight = 0f; - bool m_waitAnimator = true; HumanPoseHandler m_poseHandler = null; HumanPose m_pose; - bool m_poseParsed = false; Matrix4x4 m_matrix = Matrix4x4.identity; Matrix4x4 m_offset = Matrix4x4.identity; @@ -27,26 +21,34 @@ namespace ml_pmc float m_rightGesture = 0f; bool m_fingerTracking = false; float[] m_fingerCurls = null; + float[] m_fingerSpreads = null; internal PuppetParser() { m_fingerCurls = new float[10]; + m_fingerSpreads = new float[10]; } // Unity events void Start() { - m_puppetMaster = this.GetComponent(); + m_animator = this.GetComponent(); + m_cullMode = m_animator.cullingMode; + m_animator.cullingMode = AnimatorCullingMode.AlwaysAnimate; + m_poseHandler = new HumanPoseHandler(m_animator.avatar, m_animator.transform); + m_poseHandler.GetHumanPose(ref m_pose); m_matrix = this.transform.GetMatrix(); - StartCoroutine(WaitForAnimator()); } void OnDestroy() { + m_puppetMaster = null; if(m_animator != null) m_animator.cullingMode = m_cullMode; + m_animator = null; m_poseHandler?.Dispose(); + m_poseHandler = null; } void Update() @@ -69,88 +71,38 @@ namespace ml_pmc m_fingerCurls[7] = m_puppetMaster.PlayerAvatarMovementDataInput.RightMiddleCurl; m_fingerCurls[8] = m_puppetMaster.PlayerAvatarMovementDataInput.RightRingCurl; m_fingerCurls[9] = m_puppetMaster.PlayerAvatarMovementDataInput.RightPinkyCurl; - } - } - if(!ReferenceEquals(m_animator, null)) - { - if(m_animator != null) - { - Matrix4x4 l_current = this.transform.GetMatrix(); - m_offset = m_matrix.inverse * l_current; - m_matrix = l_current; + m_fingerSpreads[0] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftThumbSpread; + m_fingerSpreads[1] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftIndexSpread; + m_fingerSpreads[2] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftMiddleSpread; + m_fingerSpreads[3] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftRingSpread; + m_fingerSpreads[4] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftPinkySpread; + m_fingerSpreads[5] = m_puppetMaster.PlayerAvatarMovementDataInput.RightThumbSpread; + m_fingerSpreads[6] = m_puppetMaster.PlayerAvatarMovementDataInput.RightIndexSpread; + m_fingerSpreads[7] = m_puppetMaster.PlayerAvatarMovementDataInput.RightMiddleSpread; + m_fingerSpreads[8] = m_puppetMaster.PlayerAvatarMovementDataInput.RightRingSpread; + m_fingerSpreads[9] = m_puppetMaster.PlayerAvatarMovementDataInput.RightPinkySpread; } - else - Reset(); + + Matrix4x4 l_current = this.transform.GetMatrix(); + m_offset = m_matrix.inverse * l_current; + m_matrix = l_current; } } void LateUpdate() { - if(m_animator != null) - { + if((m_animator != null) && (m_poseHandler != null)) m_poseHandler.GetHumanPose(ref m_pose); - m_pose.bodyPosition *= m_armatureScale; - m_pose.bodyPosition.y += m_armatureHeight; - m_poseParsed = true; - } } - // Arbitrary - System.Collections.IEnumerator WaitForAnimator() - { - while(m_puppetMaster.avatarObject == null) - yield return null; - - while(m_animator == null) - { - m_animator = m_puppetMaster.avatarObject.GetComponent(); - yield return null; - } - - if(m_animator.isHuman) - { - m_cullMode = m_animator.cullingMode; - m_animator.cullingMode = AnimatorCullingMode.AlwaysAnimate; - - Transform l_hips = m_animator.GetBoneTransform(HumanBodyBones.Hips); - if((l_hips != null) && (l_hips.parent != null)) - { - m_armatureScale = l_hips.parent.localScale.y; - m_armatureHeight = ((m_puppetMaster.transform.GetMatrix().inverse * l_hips.parent.GetMatrix()) * ms_pointVector).y; - } - - m_poseHandler = new HumanPoseHandler(m_animator.avatar, m_animator.transform); - m_matrix = this.transform.GetMatrix(); - } - else - Reset(); - - m_waitAnimator = false; - } - - void Reset() - { - m_animator = null; - m_poseHandler?.Dispose(); - m_poseHandler = null; - m_pose = new HumanPose(); - m_poseParsed = false; - m_offset = Matrix4x4.identity; - m_sitting = false; - m_leftGesture = 0f; - m_rightGesture = 0f; - } - - public bool IsWaitingAnimator() => m_waitAnimator; - public bool HasAnimator() => !ReferenceEquals(m_animator, null); public ref HumanPose GetPose() => ref m_pose; - public bool IsPoseParsed() => m_poseParsed; - public ref Matrix4x4 GetOffset() => ref m_offset; + public ref Matrix4x4 GetLastOffset() => ref m_offset; public bool IsSitting() => m_sitting; public float GetLeftGesture() => m_leftGesture; public float GetRightGesture() => m_rightGesture; public bool HasFingerTracking() => m_fingerTracking; public ref float[] GetFingerCurls() => ref m_fingerCurls; + public ref float[] GetFingerSpreads() => ref m_fingerSpreads; } } diff --git a/ml_pmc/ml_pmc.csproj b/ml_pmc/ml_pmc.csproj index d409d5a..4e2eaec 100644 --- a/ml_pmc/ml_pmc.csproj +++ b/ml_pmc/ml_pmc.csproj @@ -7,7 +7,7 @@ SDraw None PlayerMovementCopycat - 1.0.1 + 1.0.2 diff --git a/ml_prm/Properties/AssemblyInfo.cs b/ml_prm/Properties/AssemblyInfo.cs index 3f14470..6c1e7c9 100644 --- a/ml_prm/Properties/AssemblyInfo.cs +++ b/ml_prm/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ using System.Reflection; -[assembly: MelonLoader.MelonInfo(typeof(ml_prm.PlayerRagdollMod), "PlayerRagdollMod", "1.0.6", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_prm.PlayerRagdollMod), "PlayerRagdollMod", "1.0.7", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonPriority(2)] [assembly: MelonLoader.MelonOptionalDependencies("BTKUILib")] diff --git a/ml_prm/RagdollController.cs b/ml_prm/RagdollController.cs index 044a4ff..894f4ec 100644 --- a/ml_prm/RagdollController.cs +++ b/ml_prm/RagdollController.cs @@ -454,7 +454,12 @@ namespace ml_prm if(MovementSystem.Instance.flying) MovementSystem.Instance.ChangeFlight(false); + bool l_crouch = MovementSystem.Instance.crouching; + bool l_prone = MovementSystem.Instance.prone; MovementSystem.Instance.SetImmobilized(true); + MovementSystem.Instance.ChangeCrouch(l_crouch); + MovementSystem.Instance.ChangeProne(l_prone); + PlayerSetup.Instance.animatorManager.SetAnimatorParameterTrigger("CancelEmote"); m_ragdolledParameter.SetValue(true); if(!BodySystem.isCalibrating) diff --git a/ml_prm/ml_prm.csproj b/ml_prm/ml_prm.csproj index 8fb1548..b6e6a14 100644 --- a/ml_prm/ml_prm.csproj +++ b/ml_prm/ml_prm.csproj @@ -4,7 +4,7 @@ netstandard2.1 x64 PlayerRagdollMod - 1.0.6 + 1.0.7 SDraw None PlayerRagdollMod