using MelonLoader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; using StressLevelZero; using StressLevelZero.Rig; using StressLevelZero.Player; using StressLevelZero.VRMK; using BoneSync.Networking; using BoneSync.Networking.Messages; namespace BoneSync.Player { internal class PlayerRig { public const string RIGMANAGER_SCENE_NAME = "[RigManager (Default Brett)]"; private static GameObject _rigPrefabCache = null; private static List _playerRigs = new List(); private GameObject playerRig; private RigManager rigManager; private SLZ_Body body; private CharacterAnimationManager characterAnimationManager; private Animator repAnimator; public void UpdatePlayerSync(PlayerSyncInfo playerSyncInfo) { playerRig.transform.ApplySimpleTransform(playerSyncInfo.headPos); } public static void Tick() { TryRegisterRigPrefab(); foreach (PlayerRig playerRig in _playerRigs) { try { playerRig.UpdateRig(); } catch (Exception e) { MelonLogger.Error(e.Message); //MelonLogger.Error("Failed to update player rig"); } } } public static void TryRegisterRigPrefab() { return; // disable this for now if (_rigPrefabCache) return; GetPlayerRigPrefab(); } public static GameObject GetPlayerRigPrefab() { if (_rigPrefabCache == null) { // find the rig game object in the scene GameObject playerRig = GameObject.Find(RIGMANAGER_SCENE_NAME); if (playerRig == null) { MelonLogger.Error("Failed to find RigManager scene object"); return null; } // create a clone of the rig GameObject playerRep = GameObject.Instantiate(playerRig); playerRep.gameObject.SetActive(false); playerRep.name = "[RigManager (Networked)]"; RigManager repRigManager = playerRep.GetComponent(); repRigManager.oculusControllerRig.gameObject.SetActive(false); repRigManager.steamControllerRig.gameObject.SetActive(false); repRigManager.uiRig.gameObject.SetActive(false); repRigManager.enabled = false; _rigPrefabCache = playerRep; MelonLogger.Msg("Player rig prefab created"); } return _rigPrefabCache; } public static PlayerRig InstantiatePlayerRigPrefab() { GameObject prefab = GetPlayerRigPrefab(); if (prefab == null) { return null; } GameObject go = GameObject.Instantiate(prefab); go.SetActive(true); PlayerRig playerRig = new PlayerRig(go); return playerRig; } private void UpdateRig() { Vector3 velocity = Vector3.zero; Vector3 acceleration = Vector3.zero; //SkeletonRig skeletonRig = rigManager.gameWorldSkeletonRig; //skeletonRig.OnLateUpdate(); rigManager.ControllerRig.gameObject.SetActive(false); characterAnimationManager.OnLateUpdate(); body.FullBodyUpdate(velocity, acceleration); body.ArtToBlender.UpdateBlender(); repAnimator.Update(Time.deltaTime); } private PlayerRig(GameObject go) { playerRig = go; rigManager = playerRig.GetComponent(); rigManager.enabled = true; UpdateRig(); _playerRigs.Add(this); } public void Destroy() { _playerRigs.Remove(this); GameObject.Destroy(playerRig); } } }