diff --git a/README.md b/README.md index b061a4b..39ff805 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Merged set of MelonLoader mods for ChilloutVR. | Full name | Short name | Latest version | Available in [CVRMA](https://github.com/knah/CVRMelonAssistant) | Current Status | Notes | |-----------|------------|----------------|-----------------------------------------------------------------|----------------|-------| | Avatar Change Info | ml_aci | 1.0.3 | Yes | Working | -| Avatar Motion Tweaker | ml_amt | 1.1.9 | Yes | Working | +| Avatar Motion Tweaker | ml_amt | 1.2.0 | Yes, pending review | Working | | Desktop Head Tracking | ml_dht | 1.1.1 | Yes | Working | | Desktop Reticle Switch | ml_drs | 1.0.0 | Yes | Working | | Four Point Tracking | ml_fpt | 1.0.9 | Retired | Deprecated | In-game feature since 2022r170 update diff --git a/ml_amt/Main.cs b/ml_amt/Main.cs index 407096d..a1d5125 100644 --- a/ml_amt/Main.cs +++ b/ml_amt/Main.cs @@ -1,4 +1,5 @@ -using ABI_RC.Core.Player; +using ABI.CCK.Components; +using ABI_RC.Core.Player; using ABI_RC.Systems.IK.SubSystems; using System.Reflection; @@ -6,6 +7,14 @@ namespace ml_amt { public class AvatarMotionTweaker : MelonLoader.MelonMod { + static readonly MethodInfo[] ms_fbtDetouredMethods = + { + typeof(PlayerSetup).GetMethod("Update", BindingFlags.NonPublic | BindingFlags.Instance), + typeof(PlayerSetup).GetMethod("FixedUpdate", BindingFlags.NonPublic | BindingFlags.Instance), + typeof(PlayerSetup).GetMethod("UpdatePlayerAvatarMovementData", BindingFlags.NonPublic | BindingFlags.Instance), + typeof(CVRParameterStreamEntry).GetMethod(nameof(CVRParameterStreamEntry.CheckUpdate)) + }; + static AvatarMotionTweaker ms_instance = null; MotionTweaker m_localTweaker = null; @@ -34,22 +43,21 @@ namespace ml_amt null, new HarmonyLib.HarmonyMethod(typeof(AvatarMotionTweaker).GetMethod(nameof(OnCalibrate_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) ); + + // FBT detour HarmonyInstance.Patch( typeof(BodySystem).GetMethod(nameof(BodySystem.FBTAvailable)), new HarmonyLib.HarmonyMethod(typeof(AvatarMotionTweaker).GetMethod(nameof(OnFBTAvailable_Prefix), BindingFlags.Static | BindingFlags.NonPublic)), null ); - - HarmonyInstance.Patch( - typeof(PlayerSetup).GetMethod("Update", BindingFlags.NonPublic | BindingFlags.Instance), - new HarmonyLib.HarmonyMethod(typeof(AvatarMotionTweaker).GetMethod(nameof(FBTDetour_Prefix), BindingFlags.Static | BindingFlags.NonPublic)), - new HarmonyLib.HarmonyMethod(typeof(AvatarMotionTweaker).GetMethod(nameof(FBTDetour_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) - ); - HarmonyInstance.Patch( - typeof(PlayerSetup).GetMethod("FixedUpdate", BindingFlags.NonPublic | BindingFlags.Instance), - new HarmonyLib.HarmonyMethod(typeof(AvatarMotionTweaker).GetMethod(nameof(FBTDetour_Prefix), BindingFlags.Static | BindingFlags.NonPublic)), - new HarmonyLib.HarmonyMethod(typeof(AvatarMotionTweaker).GetMethod(nameof(FBTDetour_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) - ); + foreach(MethodInfo l_detoured in ms_fbtDetouredMethods) + { + HarmonyInstance.Patch( + l_detoured, + new HarmonyLib.HarmonyMethod(typeof(AvatarMotionTweaker).GetMethod(nameof(FBTDetour_Prefix), BindingFlags.Static | BindingFlags.NonPublic)), + new HarmonyLib.HarmonyMethod(typeof(AvatarMotionTweaker).GetMethod(nameof(FBTDetour_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) + ); + } MelonLoader.MelonCoroutines.Start(WaitForLocalPlayer()); } diff --git a/ml_amt/MotionTweaker.cs b/ml_amt/MotionTweaker.cs index b646def..7b5ed0d 100644 --- a/ml_amt/MotionTweaker.cs +++ b/ml_amt/MotionTweaker.cs @@ -13,7 +13,6 @@ namespace ml_amt { static readonly FieldInfo ms_grounded = typeof(MovementSystem).GetField("_isGrounded", BindingFlags.NonPublic | BindingFlags.Instance); static readonly FieldInfo ms_groundedRaw = typeof(MovementSystem).GetField("_isGroundedRaw", BindingFlags.NonPublic | BindingFlags.Instance); - static readonly FieldInfo ms_rootVelocity = typeof(IKSolverVR).GetField("rootVelocity", BindingFlags.NonPublic | BindingFlags.Instance); static readonly int ms_emoteHash = Animator.StringToHash("Emote"); enum ParameterType @@ -136,7 +135,7 @@ namespace ml_amt float l_avatarScale = (m_avatarScale > 0f) ? (PlayerSetup.Instance._avatar.transform.localScale.y / m_avatarScale) : 0f; float l_avatarViewHeight = Mathf.Clamp(m_viewPointHeight * l_avatarScale, 0f, float.MaxValue); m_upright = Mathf.Clamp(((l_avatarViewHeight > 0f) ? (l_currentHeight / l_avatarViewHeight) : 0f), 0f, 1f); - PoseState l_poseState = (m_upright <= m_proneLimit) ? PoseState.Proning : ((m_upright <= m_crouchLimit) ? PoseState.Crouching : PoseState.Standing); + m_poseState = (m_upright <= Mathf.Min(m_proneLimit, m_crouchLimit)) ? PoseState.Proning : ((m_upright <= Mathf.Max(m_proneLimit, m_crouchLimit)) ? PoseState.Crouching : PoseState.Standing); if(m_avatarHips != null) { @@ -146,19 +145,10 @@ namespace ml_amt if(m_isInVR && (m_vrIk != null) && m_vrIk.enabled) { - if(m_poseState != l_poseState) - { - // Weird fix of torso shaking - if(m_ikOverrideCrouch && (l_poseState == PoseState.Standing)) - ms_rootVelocity.SetValue(m_vrIk.solver, Vector3.zero); - if(m_ikOverrideProne && !m_ikOverrideCrouch && (l_poseState == PoseState.Crouching)) - ms_rootVelocity.SetValue(m_vrIk.solver, Vector3.zero); - } - if(m_adjustedMovement) { - MovementSystem.Instance.ChangeCrouch(l_poseState == PoseState.Crouching); - MovementSystem.Instance.ChangeProne(l_poseState == PoseState.Proning); + MovementSystem.Instance.ChangeCrouch(m_poseState == PoseState.Crouching); + MovementSystem.Instance.ChangeProne(m_poseState == PoseState.Proning); if(!m_poseTransitions) { @@ -169,13 +159,11 @@ namespace ml_amt if(m_poseTransitions) { - PlayerSetup.Instance.animatorManager.SetAnimatorParameterBool("Crouching", (l_poseState == PoseState.Crouching) && !m_compatibleAvatar && !BodySystem.isCalibratedAsFullBody); - PlayerSetup.Instance.animatorManager.SetAnimatorParameterBool("Prone", (l_poseState == PoseState.Proning) && !m_compatibleAvatar && !BodySystem.isCalibratedAsFullBody); + PlayerSetup.Instance.animatorManager.SetAnimatorParameterBool("Crouching", (m_poseState == PoseState.Crouching) && !m_compatibleAvatar && !BodySystem.isCalibratedAsFullBody); + PlayerSetup.Instance.animatorManager.SetAnimatorParameterBool("Prone", (m_poseState == PoseState.Proning) && !m_compatibleAvatar && !BodySystem.isCalibratedAsFullBody); } } - m_poseState = l_poseState; - m_emoteActive = false; if(m_detectEmotes && (m_locomotionLayer >= 0)) { @@ -302,6 +290,9 @@ namespace ml_amt m_customProneLimit = (l_customTransform != null); m_proneLimit = m_customProneLimit ? Mathf.Clamp(l_customTransform.localPosition.y, 0f, 1f) : Settings.ProneLimit; + if(m_proneLimit > m_crouchLimit) + Utils.Swap(ref m_proneLimit, ref m_crouchLimit); + l_customTransform = PlayerSetup.Instance._avatar.transform.Find("LocomotionOffset"); m_customLocomotionOffset = (l_customTransform != null); m_locomotionOffset = m_customLocomotionOffset ? l_customTransform.localPosition : Vector3.zero; diff --git a/ml_amt/Properties/AssemblyInfo.cs b/ml_amt/Properties/AssemblyInfo.cs index c60291c..5577e72 100644 --- a/ml_amt/Properties/AssemblyInfo.cs +++ b/ml_amt/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; [assembly: AssemblyTitle("AvatarMotionTweaker")] -[assembly: AssemblyVersion("1.1.9")] -[assembly: AssemblyFileVersion("1.1.9")] +[assembly: AssemblyVersion("1.2.0")] +[assembly: AssemblyFileVersion("1.2.0")] -[assembly: MelonLoader.MelonInfo(typeof(ml_amt.AvatarMotionTweaker), "AvatarMotionTweaker", "1.1.9", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_amt.AvatarMotionTweaker), "AvatarMotionTweaker", "1.2.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] [assembly: MelonLoader.MelonPlatformDomain(MelonLoader.MelonPlatformDomainAttribute.CompatibleDomains.MONO)] \ No newline at end of file diff --git a/ml_amt/Utils.cs b/ml_amt/Utils.cs index 31b75d8..bf5087c 100644 --- a/ml_amt/Utils.cs +++ b/ml_amt/Utils.cs @@ -12,5 +12,13 @@ namespace ml_amt { return Matrix4x4.TRS(p_pos ? p_transform.position : Vector3.zero, p_rot ? p_transform.rotation : Quaternion.identity, p_scl ? p_transform.localScale : Vector3.one); } + + // Usefull + public static void Swap(ref T lhs, ref T rhs) + { + T temp = lhs; + lhs = rhs; + rhs = temp; + } } }