180 lines
6.3 KiB
C#
Raw Normal View History

2020-08-21 14:04:13 +01:00
using OWML.ModHelper.Events;
2020-08-10 19:24:28 +02:00
using QSB.Events;
2020-08-21 14:04:13 +01:00
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.Networking;
2020-02-21 23:36:07 +01:00
namespace QSB.Animation
{
public class AnimationSync : PlayerSyncObject
{
protected override uint PlayerIdOffset => 0;
private Animator _anim;
private Animator _bodyAnim;
2020-03-02 20:28:52 +01:00
private NetworkAnimator _netAnim;
private RuntimeAnimatorController _suitedAnimController;
private AnimatorOverrideController _unsuitedAnimController;
private GameObject _suitedGraphics;
private GameObject _unsuitedGraphics;
private PlayerCharacterController _playerController;
private CrouchSync _crouchSync;
2020-07-28 01:14:32 +02:00
private void Awake()
{
2020-03-02 20:28:52 +01:00
_anim = gameObject.AddComponent<Animator>();
_netAnim = gameObject.AddComponent<NetworkAnimator>();
_netAnim.enabled = false;
2020-03-02 20:28:52 +01:00
_netAnim.animator = _anim;
}
2020-03-02 20:28:52 +01:00
private void OnDestroy()
{
2020-08-19 21:28:04 +01:00
_netAnim.enabled = false;
if (_playerController == null)
2020-08-18 19:44:11 +01:00
{
2020-08-19 21:28:04 +01:00
return;
2020-08-18 19:44:11 +01:00
}
2020-08-19 21:28:04 +01:00
_playerController.OnJump -= OnJump;
_playerController.OnBecomeGrounded -= OnBecomeGrounded;
_playerController.OnBecomeUngrounded -= OnBecomeUngrounded;
GlobalMessenger.RemoveListener(EventNames.SuitUp, OnSuitUp);
GlobalMessenger.RemoveListener(EventNames.RemoveSuit, OnSuitDown);
}
private void InitCommon(Transform body)
{
_netAnim.enabled = true;
2020-03-02 20:28:52 +01:00
_bodyAnim = body.GetComponent<Animator>();
var mirror = body.gameObject.AddComponent<AnimatorMirror>();
if (isLocalPlayer)
{
mirror.Init(_bodyAnim, _anim);
}
else
{
2020-03-02 20:28:52 +01:00
mirror.Init(_anim, _bodyAnim);
}
2020-03-02 20:28:52 +01:00
PlayerRegistry.PlayerSyncObjects.Add(this);
2020-03-02 20:28:52 +01:00
for (var i = 0; i < _anim.parameterCount; i++)
{
2020-03-02 20:28:52 +01:00
_netAnim.SetParameterAutoSend(i, true);
}
}
public void InitLocal(Transform body)
{
2020-03-02 20:28:52 +01:00
InitCommon(body);
_playerController = body.parent.GetComponent<PlayerCharacterController>();
_playerController.OnJump += OnJump;
_playerController.OnBecomeGrounded += OnBecomeGrounded;
_playerController.OnBecomeUngrounded += OnBecomeUngrounded;
2020-08-10 19:24:28 +02:00
GlobalMessenger.AddListener(EventNames.SuitUp, OnSuitUp);
GlobalMessenger.AddListener(EventNames.RemoveSuit, OnSuitDown);
InitCrouchSync();
}
public void InitRemote(Transform body)
{
2020-03-02 20:28:52 +01:00
InitCommon(body);
var playerAnimController = body.GetComponent<PlayerAnimController>();
playerAnimController.enabled = false;
2020-08-09 19:41:23 +02:00
_suitedAnimController = AnimControllerPatch.SuitedAnimController;
_unsuitedAnimController = playerAnimController.GetValue<AnimatorOverrideController>("_unsuitedAnimOverride");
_suitedGraphics = playerAnimController.GetValue<GameObject>("_suitedGroup");
_unsuitedGraphics = playerAnimController.GetValue<GameObject>("_unsuitedGroup");
playerAnimController.SetValue("_suitedGroup", new GameObject());
playerAnimController.SetValue("_unsuitedGroup", new GameObject());
playerAnimController.SetValue("_baseAnimController", null);
playerAnimController.SetValue("_unsuitedAnimOverride", null);
2020-08-16 21:30:21 +02:00
playerAnimController.SetValue("_rightArmHidden", false);
2020-08-16 22:39:21 +02:00
var rightArmObjects = playerAnimController.GetValue<GameObject[]>("_rightArmObjects").ToList();
rightArmObjects.ForEach(rightArmObject => rightArmObject.layer = LayerMask.NameToLayer("Default"));
body.Find("player_mesh_noSuit:Traveller_HEA_Player/player_mesh_noSuit:Player_Head").gameObject.layer = 0;
body.Find("Traveller_Mesh_v01:Traveller_Geo/Traveller_Mesh_v01:PlayerSuit_Helmet").gameObject.layer = 0;
InitCrouchSync();
}
private void InitCrouchSync()
{
_crouchSync = gameObject.AddComponent<CrouchSync>();
_crouchSync.Init(this, _playerController, _bodyAnim);
}
private void OnJump() => SendTrigger(AnimTrigger.Jump);
private void OnBecomeGrounded() => SendTrigger(AnimTrigger.Grounded);
private void OnBecomeUngrounded() => SendTrigger(AnimTrigger.Ungrounded);
private void OnSuitUp() => SendTrigger(AnimTrigger.SuitUp);
private void OnSuitDown() => SendTrigger(AnimTrigger.SuitDown);
2020-08-21 14:01:31 +01:00
public void SendTrigger(AnimTrigger trigger, float value = 0)
{
2020-08-22 17:05:09 +01:00
GlobalMessenger<short, float>.FireEvent(EventNames.QSBAnimTrigger, (short)trigger, value);
}
2020-08-22 17:05:09 +01:00
public void HandleTrigger(AnimTrigger trigger, float value)
{
switch (trigger)
{
case AnimTrigger.Jump:
case AnimTrigger.Grounded:
case AnimTrigger.Ungrounded:
_bodyAnim.SetTrigger(trigger.ToString());
break;
case AnimTrigger.SuitUp:
2020-08-09 21:58:03 +01:00
SuitUp();
break;
case AnimTrigger.SuitDown:
2020-08-09 21:58:03 +01:00
SuitDown();
break;
2020-07-28 01:14:32 +02:00
case AnimTrigger.Crouch:
_crouchSync.CrouchParam.Target = value;
2020-07-28 01:14:32 +02:00
break;
default:
throw new ArgumentOutOfRangeException(nameof(trigger), trigger, null);
}
}
2020-08-13 21:46:16 +02:00
private void SuitUp()
2020-08-09 21:58:03 +01:00
{
_bodyAnim.runtimeAnimatorController = _suitedAnimController;
_anim.runtimeAnimatorController = _suitedAnimController;
2020-08-09 21:58:03 +01:00
_unsuitedGraphics.SetActive(false);
_suitedGraphics.SetActive(true);
}
2020-08-13 21:46:16 +02:00
private void SuitDown()
2020-08-09 21:58:03 +01:00
{
_bodyAnim.runtimeAnimatorController = _unsuitedAnimController;
_anim.runtimeAnimatorController = _unsuitedAnimController;
2020-08-09 21:58:03 +01:00
_unsuitedGraphics.SetActive(true);
_suitedGraphics.SetActive(false);
}
2020-08-13 21:46:16 +02:00
public void SetSuitState(bool state)
{
if (state)
{
SuitUp();
2020-08-22 17:05:09 +01:00
return;
2020-08-13 21:46:16 +02:00
}
2020-08-22 17:05:09 +01:00
SuitDown();
2020-08-13 21:46:16 +02:00
}
}
}