Skip to content

Commit 5dd4701

Browse files
authored
Merge pull request #191 from Raicuparta/dev
master <- dev (0.5.0)
2 parents ecc0f1f + 321c7db commit 5dd4701

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+961
-597
lines changed

QSB/Animation/AnimFloatParam.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,5 @@ public float Smooth(float smoothTime)
1414
Current = Mathf.SmoothDamp(Current, Target, ref _velocity, smoothTime);
1515
return Current;
1616
}
17-
1817
}
1918
}

QSB/Animation/AnimTriggerEvent.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using QSB.Events;
2+
using QSB.Messaging;
3+
4+
namespace QSB.Animation
5+
{
6+
public class AnimTriggerEvent : QSBEvent<AnimTriggerMessage>
7+
{
8+
public override EventType Type => EventType.AnimTrigger;
9+
10+
public override void SetupListener()
11+
{
12+
GlobalMessenger<short, float>.AddListener(EventNames.QSBAnimTrigger, Handler);
13+
}
14+
15+
public override void CloseListener()
16+
{
17+
GlobalMessenger<short, float>.RemoveListener(EventNames.QSBAnimTrigger, Handler);
18+
}
19+
20+
private void Handler(short triggerId, float value) => SendEvent(CreateMessage(triggerId, value));
21+
22+
private AnimTriggerMessage CreateMessage(short triggerId, float value) => new AnimTriggerMessage
23+
{
24+
AboutId = LocalPlayerId,
25+
TriggerId = triggerId,
26+
Value = value
27+
};
28+
29+
public override void OnReceiveRemote(AnimTriggerMessage message)
30+
{
31+
var animationSync = PlayerRegistry.GetSyncObject<AnimationSync>(message.AboutId);
32+
if (animationSync == null)
33+
{
34+
return;
35+
}
36+
animationSync.HandleTrigger((AnimTrigger)message.TriggerId, message.Value);
37+
}
38+
}
39+
}

QSB/Animation/AnimationSync.cs

Lines changed: 40 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,26 @@
1-
using System;
2-
using OWML.ModHelper.Events;
1+
using OWML.ModHelper.Events;
32
using QSB.Events;
4-
using QSB.Messaging;
3+
using System;
4+
using System.Linq;
55
using UnityEngine;
66
using UnityEngine.Networking;
77

88
namespace 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
}

QSB/Animation/CrouchSync.cs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
using UnityEngine;
3+
using UnityEngine.Networking;
4+
5+
namespace QSB.Animation
6+
{
7+
public class CrouchSync : NetworkBehaviour
8+
{
9+
public AnimFloatParam CrouchParam { get; } = new AnimFloatParam();
10+
11+
private const float CrouchSendInterval = 0.1f;
12+
private const float CrouchChargeThreshold = 0.01f;
13+
private const float CrouchSmoothTime = 0.05f;
14+
private const int CrouchLayerIndex = 1;
15+
16+
private float _sendTimer;
17+
private float _lastSentJumpChargeFraction;
18+
19+
private AnimationSync _animationSync;
20+
private PlayerCharacterController _playerController;
21+
private Animator _bodyAnim;
22+
23+
public void Init(AnimationSync animationSync, PlayerCharacterController playerController, Animator bodyAnim)
24+
{
25+
_animationSync = animationSync;
26+
_playerController = playerController;
27+
_bodyAnim = bodyAnim;
28+
}
29+
30+
private void Update()
31+
{
32+
if (isLocalPlayer)
33+
{
34+
SyncLocalCrouch();
35+
return;
36+
}
37+
SyncRemoteCrouch();
38+
}
39+
40+
private void SyncLocalCrouch()
41+
{
42+
if (_playerController == null)
43+
{
44+
return;
45+
}
46+
_sendTimer += Time.unscaledDeltaTime;
47+
if (_sendTimer < CrouchSendInterval)
48+
{
49+
return;
50+
}
51+
var jumpChargeFraction = _playerController.GetJumpChargeFraction();
52+
if (Math.Abs(jumpChargeFraction - _lastSentJumpChargeFraction) < CrouchChargeThreshold)
53+
{
54+
return;
55+
}
56+
_animationSync.SendTrigger(AnimTrigger.Crouch, jumpChargeFraction);
57+
_lastSentJumpChargeFraction = jumpChargeFraction;
58+
_sendTimer = 0;
59+
}
60+
61+
private void SyncRemoteCrouch()
62+
{
63+
if (_bodyAnim == null)
64+
{
65+
return;
66+
}
67+
CrouchParam.Smooth(CrouchSmoothTime);
68+
var jumpChargeFraction = CrouchParam.Current;
69+
_bodyAnim.SetLayerWeight(CrouchLayerIndex, jumpChargeFraction);
70+
}
71+
}
72+
}

QSB/Animation/PlayerSuitEvent.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,32 @@ namespace QSB.Animation
55
{
66
public class PlayerSuitEvent : QSBEvent<ToggleMessage>
77
{
8-
public override MessageType Type => MessageType.SuitActiveChange;
8+
public override EventType Type => EventType.SuitActiveChange;
99

1010
public override void SetupListener()
1111
{
12-
GlobalMessenger.AddListener(EventNames.SuitUp, () => SendEvent(CreateMessage(true)));
13-
GlobalMessenger.AddListener(EventNames.RemoveSuit, () => SendEvent(CreateMessage(false)));
12+
GlobalMessenger.AddListener(EventNames.SuitUp, HandleSuitUp);
13+
GlobalMessenger.AddListener(EventNames.RemoveSuit, HandleSuitDown);
1414
}
1515

16+
public override void CloseListener()
17+
{
18+
GlobalMessenger.RemoveListener(EventNames.SuitUp, HandleSuitUp);
19+
GlobalMessenger.RemoveListener(EventNames.RemoveSuit, HandleSuitDown);
20+
}
21+
22+
private void HandleSuitUp() => SendEvent(CreateMessage(true));
23+
private void HandleSuitDown() => SendEvent(CreateMessage(false));
24+
1625
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
1726
{
18-
SenderId = LocalPlayerId,
27+
AboutId = LocalPlayerId,
1928
ToggleValue = value
2029
};
2130

2231
public override void OnReceiveRemote(ToggleMessage message)
2332
{
24-
var player = PlayerRegistry.GetPlayer(message.SenderId);
33+
var player = PlayerRegistry.GetPlayer(message.AboutId);
2534
player?.UpdateState(State.Suit, message.ToggleValue);
2635
}
2736

0 commit comments

Comments
 (0)