1- using System ;
2- using OWML . ModHelper . Events ;
1+ using OWML . ModHelper . Events ;
32using QSB . Events ;
4- using QSB . Messaging ;
3+ using System ;
4+ using System . Linq ;
55using UnityEngine ;
66using UnityEngine . Networking ;
77
88namespace QSB . Animation
99{
10- public class AnimationSync : NetworkBehaviour
10+ public class AnimationSync : PlayerSyncObject
1111 {
12- private const float CrouchSendInterval = 0.1f ;
13- private const float CrouchChargeThreshold = 0.01f ;
14- private const float CrouchSmoothTime = 0.05f ;
15- private const int CrouchLayerIndex = 1 ;
12+ protected override uint PlayerIdOffset => 0 ;
1613
1714 private Animator _anim ;
1815 private Animator _bodyAnim ;
1916 private NetworkAnimator _netAnim ;
20- private MessageHandler < AnimTriggerMessage > _triggerHandler ;
2117
2218 private RuntimeAnimatorController _suitedAnimController ;
2319 private AnimatorOverrideController _unsuitedAnimController ;
2420 private GameObject _suitedGraphics ;
2521 private GameObject _unsuitedGraphics ;
2622 private PlayerCharacterController _playerController ;
27-
28- private readonly AnimFloatParam _crouchParam = new AnimFloatParam ( ) ;
29- private float _sendTimer ;
30- private float _lastSentJumpChargeFraction ;
23+ private CrouchSync _crouchSync ;
3124
3225 private void Awake ( )
3326 {
@@ -37,6 +30,20 @@ private void Awake()
3730 _netAnim . animator = _anim ;
3831 }
3932
33+ private void OnDestroy ( )
34+ {
35+ _netAnim . enabled = false ;
36+ if ( _playerController == null )
37+ {
38+ return ;
39+ }
40+ _playerController . OnJump -= OnJump ;
41+ _playerController . OnBecomeGrounded -= OnBecomeGrounded ;
42+ _playerController . OnBecomeUngrounded -= OnBecomeUngrounded ;
43+ GlobalMessenger . RemoveListener ( EventNames . SuitUp , OnSuitUp ) ;
44+ GlobalMessenger . RemoveListener ( EventNames . RemoveSuit , OnSuitDown ) ;
45+ }
46+
4047 private void InitCommon ( Transform body )
4148 {
4249 _netAnim . enabled = true ;
@@ -51,7 +58,7 @@ private void InitCommon(Transform body)
5158 mirror . Init ( _anim , _bodyAnim ) ;
5259 }
5360
54- PlayerRegistry . AnimationSyncs . Add ( this ) ;
61+ PlayerRegistry . PlayerSyncObjects . Add ( this ) ;
5562
5663 for ( var i = 0 ; i < _anim . parameterCount ; i ++ )
5764 {
@@ -63,17 +70,15 @@ public void InitLocal(Transform body)
6370 {
6471 InitCommon ( body ) ;
6572
66- _triggerHandler = new MessageHandler < AnimTriggerMessage > ( MessageType . AnimTrigger ) ;
67- _triggerHandler . OnServerReceiveMessage += OnServerReceiveMessage ;
68- _triggerHandler . OnClientReceiveMessage += OnClientReceiveMessage ;
69-
7073 _playerController = body . parent . GetComponent < PlayerCharacterController > ( ) ;
7174 _playerController . OnJump += OnJump ;
7275 _playerController . OnBecomeGrounded += OnBecomeGrounded ;
7376 _playerController . OnBecomeUngrounded += OnBecomeUngrounded ;
7477
7578 GlobalMessenger . AddListener ( EventNames . SuitUp , OnSuitUp ) ;
7679 GlobalMessenger . AddListener ( EventNames . RemoveSuit , OnSuitDown ) ;
80+
81+ InitCrouchSync ( ) ;
7782 }
7883
7984 public void InitRemote ( Transform body )
@@ -92,9 +97,21 @@ public void InitRemote(Transform body)
9297 playerAnimController . SetValue ( "_unsuitedGroup" , new GameObject ( ) ) ;
9398 playerAnimController . SetValue ( "_baseAnimController" , null ) ;
9499 playerAnimController . SetValue ( "_unsuitedAnimOverride" , null ) ;
100+ playerAnimController . SetValue ( "_rightArmHidden" , false ) ;
101+
102+ var rightArmObjects = playerAnimController . GetValue < GameObject [ ] > ( "_rightArmObjects" ) . ToList ( ) ;
103+ rightArmObjects . ForEach ( rightArmObject => rightArmObject . layer = LayerMask . NameToLayer ( "Default" ) ) ;
95104
96105 body . Find ( "player_mesh_noSuit:Traveller_HEA_Player/player_mesh_noSuit:Player_Head" ) . gameObject . layer = 0 ;
97106 body . Find ( "Traveller_Mesh_v01:Traveller_Geo/Traveller_Mesh_v01:PlayerSuit_Helmet" ) . gameObject . layer = 0 ;
107+
108+ InitCrouchSync ( ) ;
109+ }
110+
111+ private void InitCrouchSync ( )
112+ {
113+ _crouchSync = gameObject . AddComponent < CrouchSync > ( ) ;
114+ _crouchSync . Init ( this , _playerController , _bodyAnim ) ;
98115 }
99116
100117 private void OnJump ( ) => SendTrigger ( AnimTrigger . Jump ) ;
@@ -104,54 +121,12 @@ public void InitRemote(Transform body)
104121 private void OnSuitUp ( ) => SendTrigger ( AnimTrigger . SuitUp ) ;
105122 private void OnSuitDown ( ) => SendTrigger ( AnimTrigger . SuitDown ) ;
106123
107- public void Reset ( )
108- {
109- if ( _playerController == null )
110- {
111- return ;
112- }
113- _netAnim . enabled = false ;
114- _playerController . OnJump -= OnJump ;
115- _playerController . OnBecomeGrounded -= OnBecomeGrounded ;
116- _playerController . OnBecomeUngrounded -= OnBecomeUngrounded ;
117- GlobalMessenger . RemoveListener ( EventNames . SuitUp , OnSuitUp ) ;
118- GlobalMessenger . RemoveListener ( EventNames . RemoveSuit , OnSuitDown ) ;
119- }
120-
121- private void SendTrigger ( AnimTrigger trigger , float value = 0 )
122- {
123- var message = new AnimTriggerMessage
124- {
125- SenderId = netId . Value ,
126- TriggerId = ( short ) trigger ,
127- Value = value
128- } ;
129- if ( isServer )
130- {
131- _triggerHandler . SendToAll ( message ) ;
132- }
133- else
134- {
135- _triggerHandler . SendToServer ( message ) ;
136- }
137- }
138-
139- private void OnServerReceiveMessage ( AnimTriggerMessage message )
140- {
141- _triggerHandler . SendToAll ( message ) ;
142- }
143-
144- private void OnClientReceiveMessage ( AnimTriggerMessage message )
124+ public void SendTrigger ( AnimTrigger trigger , float value = 0 )
145125 {
146- var animationSync = PlayerRegistry . GetAnimationSync ( message . SenderId ) ;
147- if ( animationSync == null || animationSync == this )
148- {
149- return ;
150- }
151- animationSync . HandleTrigger ( ( AnimTrigger ) message . TriggerId , message . Value ) ;
126+ GlobalMessenger < short , float > . FireEvent ( EventNames . QSBAnimTrigger , ( short ) trigger , value ) ;
152127 }
153128
154- private void HandleTrigger ( AnimTrigger trigger , float value )
129+ public void HandleTrigger ( AnimTrigger trigger , float value )
155130 {
156131 switch ( trigger )
157132 {
@@ -167,7 +142,7 @@ private void HandleTrigger(AnimTrigger trigger, float value)
167142 SuitDown ( ) ;
168143 break ;
169144 case AnimTrigger . Crouch :
170- _crouchParam . Target = value ;
145+ _crouchSync . CrouchParam . Target = value ;
171146 break ;
172147 default :
173148 throw new ArgumentOutOfRangeException ( nameof ( trigger ) , trigger , null ) ;
@@ -195,56 +170,9 @@ public void SetSuitState(bool state)
195170 if ( state )
196171 {
197172 SuitUp ( ) ;
198- }
199- else
200- {
201- SuitDown ( ) ;
202- }
203- }
204-
205- private void Update ( )
206- {
207- if ( isLocalPlayer )
208- {
209- SyncLocalCrouch ( ) ;
210- }
211- else
212- {
213- SyncRemoteCrouch ( ) ;
214- }
215- }
216-
217- private void SyncLocalCrouch ( )
218- {
219- if ( _playerController == null )
220- {
221- return ;
222- }
223- _sendTimer += Time . unscaledDeltaTime ;
224- if ( _sendTimer < CrouchSendInterval )
225- {
226173 return ;
227174 }
228- var jumpChargeFraction = _playerController . GetJumpChargeFraction ( ) ;
229- if ( Math . Abs ( jumpChargeFraction - _lastSentJumpChargeFraction ) < CrouchChargeThreshold )
230- {
231- return ;
232- }
233- SendTrigger ( AnimTrigger . Crouch , jumpChargeFraction ) ;
234- _lastSentJumpChargeFraction = jumpChargeFraction ;
235- _sendTimer = 0 ;
236- }
237-
238- private void SyncRemoteCrouch ( )
239- {
240- if ( _bodyAnim == null )
241- {
242- return ;
243- }
244- _crouchParam . Smooth ( CrouchSmoothTime ) ;
245- var jumpChargeFraction = _crouchParam . Current ;
246- _bodyAnim . SetLayerWeight ( CrouchLayerIndex , jumpChargeFraction ) ;
175+ SuitDown ( ) ;
247176 }
248-
249177 }
250178}
0 commit comments