133 lines
4.1 KiB
C#
133 lines
4.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|