NAK_CVR_Mods/DesktopVRIK/HarmonyPatches.cs
NotAKidoS df61830c83 Removed compatibility mode & added integrity checks.
Why the fuck did deleting code make the issue better...
2022-12-26 00:52:50 -06:00

91 lines
No EOL
3.3 KiB
C#

using ABI.CCK.Components;
using ABI_RC.Core.Player;
using ABI_RC.Core.Savior;
using ABI_RC.Systems.IK;
using ABI_RC.Systems.IK.SubSystems;
using HarmonyLib;
using RootMotion.FinalIK;
using UnityEngine;
namespace DesktopVRIK;
[HarmonyPatch]
internal class HarmonyPatches
{
[HarmonyPostfix]
[HarmonyPatch(typeof(PlayerSetup), "SetupAvatarGeneral")]
private static void SetupDesktopIKSystem(ref CVRAvatar ____avatarDescriptor, ref Animator ____animator)
{
if (!MetaPort.Instance.isUsingVr && DesktopVRIK.Instance.Setting_Enabled)
{
if (____avatarDescriptor != null && ____animator != null && ____animator.isHuman)
{
//this will stop at the useless isVr return (the function is only ever called by vr anyways...)
IKSystem.Instance.InitializeAvatar(____avatarDescriptor);
}
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(IKSystem), "InitializeAvatar")]
private static void InitializeDesktopAvatarVRIK(CVRAvatar avatar, ref VRIK ____vrik, ref HumanPoseHandler ____poseHandler, ref float[] ___HandCalibrationPoseMuscles, ref Vector3 ____referenceRootPosition, ref Quaternion ____referenceRootRotation, ref HumanPose ___humanPose)
{
if (!MetaPort.Instance.isUsingVr && DesktopVRIK.Instance.Setting_Enabled)
{
if (IKSystem.Instance.animator != null && IKSystem.Instance.animator.avatar != null && IKSystem.Instance.animator.avatar.isHuman)
{
//need IKSystem to see VRIK component for setup
if (____vrik == null)
{
____vrik = avatar.gameObject.AddComponent<VRIK>();
}
//why the fuck does this fix bad armatures and heels in ground ???
if (____poseHandler == null)
{
____poseHandler = new HumanPoseHandler(IKSystem.Instance.animator.avatar, IKSystem.Instance.animator.transform);
}
____poseHandler.GetHumanPose(ref ___humanPose);
____poseHandler.SetHumanPose(ref ___humanPose);
//now I calibrate DesktopVRIK
DesktopVRIK.Instance.CalibrateDesktopVRIK(avatar);
}
}
}
private static bool emotePlayed = false;
[HarmonyPostfix]
[HarmonyPatch(typeof(PlayerSetup), "Update")]
private static void CorrectVRIK(ref bool ____emotePlaying, ref LookAtIK ___lookIK)
{
if (MetaPort.Instance.isUsingVr || DesktopVRIK.Instance == null) return;
//might need to rework this in the future
if (____emotePlaying && !emotePlayed)
{
emotePlayed = true;
if (DesktopVRIK.Instance.Setting_EmoteVRIK)
{
BodySystem.TrackingEnabled = false;
//IKSystem.vrik.solver.Reset();
}
if (DesktopVRIK.Instance.Setting_EmoteLookAtIK && ___lookIK != null)
{
___lookIK.enabled = false;
}
}
else if (!____emotePlaying && emotePlayed)
{
emotePlayed = false;
IKSystem.vrik.solver.Reset();
BodySystem.TrackingEnabled = true;
if (___lookIK != null)
{
___lookIK.enabled = true;
}
}
}
}