sync crouching (#97)

This commit is contained in:
AmazingAlek 2020-07-28 01:14:32 +02:00 committed by GitHub
parent 49fa4d1eeb
commit 46deed3d4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 66 additions and 5 deletions

View File

@ -6,6 +6,7 @@
Grounded = 1,
Ungrounded = 2,
SuitUp = 3,
SuitDown = 4
SuitDown = 4,
Crouch = 5
}
}

View File

@ -9,15 +9,18 @@ namespace QSB.Animation
public short TriggerId;
public uint SenderId;
public float Value;
public override void Deserialize(NetworkReader reader)
{
Value = reader.ReadSingle();
TriggerId = reader.ReadInt16();
SenderId = reader.ReadPackedUInt32();
}
public override void Serialize(NetworkWriter writer)
{
writer.Write(Value);
writer.Write(TriggerId);
writer.Write(SenderId);
}

View File

@ -9,6 +9,11 @@ namespace QSB.Animation
{
public class AnimationSync : NetworkBehaviour
{
private const float CrouchSendInterval = 0.1f;
private const float CrouchChargeThreshold = 0.01f;
private const float CrouchSmoothTime = 0.05f;
private const int CrouchLayerIndex = 1;
private Animator _anim;
private Animator _bodyAnim;
private NetworkAnimator _netAnim;
@ -20,6 +25,10 @@ namespace QSB.Animation
private GameObject _unsuitedGraphics;
private PlayerCharacterController _playerController;
private readonly AnimFloatParam _crouchParam = new AnimFloatParam();
private float _sendTimer;
private float _lastSentJumpChargeFraction;
private static readonly Dictionary<uint, AnimationSync> PlayerAnimSyncs = new Dictionary<uint, AnimationSync>();
private void Awake()
@ -111,12 +120,13 @@ namespace QSB.Animation
GlobalMessenger.RemoveListener("RemoveSuit", OnSuitDown);
}
private void SendTrigger(AnimTrigger trigger)
private void SendTrigger(AnimTrigger trigger, float value = 0)
{
var message = new AnimTriggerMessage
{
SenderId = netId.Value,
TriggerId = (short)trigger
TriggerId = (short)trigger,
Value = value
};
if (isServer)
{
@ -137,11 +147,11 @@ namespace QSB.Animation
{
if (PlayerAnimSyncs.TryGetValue(message.SenderId, out var animSync) && animSync != this)
{
animSync.HandleTrigger((AnimTrigger)message.TriggerId);
animSync.HandleTrigger((AnimTrigger)message.TriggerId, message.Value);
}
}
private void HandleTrigger(AnimTrigger trigger)
private void HandleTrigger(AnimTrigger trigger, float value)
{
switch (trigger)
{
@ -160,10 +170,57 @@ namespace QSB.Animation
_unsuitedGraphics.SetActive(true);
_suitedGraphics.SetActive(false);
break;
case AnimTrigger.Crouch:
_crouchParam.Target = value;
break;
default:
throw new ArgumentOutOfRangeException(nameof(trigger), trigger, null);
}
}
private void Update()
{
if (isLocalPlayer)
{
SyncLocalCrouch();
}
else
{
SyncRemoteCrouch();
}
}
private void SyncLocalCrouch()
{
if (_playerController == null)
{
return;
}
_sendTimer += Time.unscaledDeltaTime;
if (_sendTimer < CrouchSendInterval)
{
return;
}
var jumpChargeFraction = _playerController.GetJumpChargeFraction();
if (Math.Abs(jumpChargeFraction - _lastSentJumpChargeFraction) < CrouchChargeThreshold)
{
return;
}
SendTrigger(AnimTrigger.Crouch, jumpChargeFraction);
_lastSentJumpChargeFraction = jumpChargeFraction;
_sendTimer = 0;
}
private void SyncRemoteCrouch()
{
if (_bodyAnim == null)
{
return;
}
_crouchParam.Smooth(CrouchSmoothTime);
var jumpChargeFraction = _crouchParam.Current;
_bodyAnim.SetLayerWeight(CrouchLayerIndex, jumpChargeFraction);
}
}
}