This commit is contained in:
2025-02-27 16:26:04 +02:00
parent b721e2d25e
commit 43f6710697
21 changed files with 742 additions and 46 deletions

View File

@@ -0,0 +1,132 @@
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<PlayerRig> _playerRigs = new List<PlayerRig>();
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<RigManager>();
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>();
rigManager.enabled = true;
UpdateRig();
_playerRigs.Add(this);
}
public void Destroy()
{
_playerRigs.Remove(this);
GameObject.Destroy(playerRig);
}
}
}