From dffdf02be596db3d35bdd8d19ba6ada7d796a137 Mon Sep 17 00:00:00 2001 From: MrGadget Date: Fri, 10 Jan 2020 19:33:10 -0500 Subject: [PATCH] feat: Network Animator can reset triggers (#1420) --- Assets/Mirror/Components/NetworkAnimator.cs | 55 ++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/Assets/Mirror/Components/NetworkAnimator.cs b/Assets/Mirror/Components/NetworkAnimator.cs index 59f71b82709..ec018bc51e2 100644 --- a/Assets/Mirror/Components/NetworkAnimator.cs +++ b/Assets/Mirror/Components/NetworkAnimator.cs @@ -199,6 +199,11 @@ void HandleAnimTriggerMsg(int hash) animator.SetTrigger(hash); } + void HandleAnimResetTriggerMsg(int hash) + { + animator.ResetTrigger(hash); + } + ulong NextDirtyBits() { ulong dirtyBits = 0; @@ -358,6 +363,16 @@ public void SetTrigger(string triggerName) SetTrigger(Animator.StringToHash(triggerName)); } + /// + /// Causes an animation trigger to be reset for a networked object. + /// If local authority is set, and this is called from the client, then the trigger will be reset on the server and all clients. If not, then this is called on the server, and the trigger will be reset on all clients. + /// + /// Name of trigger. + public void ResetTrigger(string triggerName) + { + ResetTrigger(Animator.StringToHash(triggerName)); + } + /// /// Causes an animation trigger to be invoked for a networked object. /// @@ -379,7 +394,29 @@ public void SetTrigger(int hash) } } + /// + /// Causes an animation trigger to be reset for a networked object. + /// + /// Hash id of trigger (from the Animator). + public void ResetTrigger(int hash) + { + if (hasAuthority && clientAuthority) + { + if (ClientScene.readyConnection != null) + { + CmdOnAnimationResetTriggerServerMessage(hash); + } + return; + } + + if (isServer && !clientAuthority) + { + RpcOnAnimationResetTriggerClientMessage(hash); + } + } + #region server message handlers + [Command] void CmdOnAnimationServerMessage(int stateHash, float normalizedTime, int layerId, byte[] parameters) { @@ -405,9 +442,19 @@ void CmdOnAnimationTriggerServerMessage(int hash) HandleAnimTriggerMsg(hash); RpcOnAnimationTriggerClientMessage(hash); } + + [Command] + void CmdOnAnimationResetTriggerServerMessage(int hash) + { + // handle and broadcast + HandleAnimResetTriggerMsg(hash); + RpcOnAnimationResetTriggerClientMessage(hash); + } + #endregion #region client message handlers + [ClientRpc] void RpcOnAnimationClientMessage(int stateHash, float normalizedTime, int layerId, byte[] parameters) { @@ -420,12 +467,18 @@ void RpcOnAnimationParametersClientMessage(byte[] parameters) HandleAnimParamsMsg(new NetworkReader(parameters)); } - // server sends this to one client [ClientRpc] void RpcOnAnimationTriggerClientMessage(int hash) { HandleAnimTriggerMsg(hash); } + + [ClientRpc] + void RpcOnAnimationResetTriggerClientMessage(int hash) + { + HandleAnimResetTriggerMsg(hash); + } + #endregion } }