@@ -58,11 +58,10 @@ public void NetworkUpdate(NetworkUpdateStage updateStage)
5858 m_ProcessParameterUpdates . Clear ( ) ;
5959
6060 // Only owners check for Animator changes
61- if ( m_NetworkAnimator . IsOwner )
61+ if ( m_NetworkAnimator . IsOwner && ! m_NetworkAnimator . IsServerAuthoritative ( ) || m_NetworkAnimator . IsServerAuthoritative ( ) && m_NetworkAnimator . NetworkManager . IsServer )
6262 {
6363 m_NetworkAnimator . CheckForAnimatorChanges ( ) ;
6464 }
65-
6665 break ;
6766 }
6867 }
@@ -209,6 +208,19 @@ public Animator Animator
209208 }
210209 }
211210
211+ internal bool IsServerAuthoritative ( )
212+ {
213+ return OnIsServerAuthoritative ( ) ;
214+ }
215+
216+ /// <summary>
217+ /// Override this method and return false to switch to owner authoritative mode
218+ /// </summary>
219+ protected virtual bool OnIsServerAuthoritative ( )
220+ {
221+ return true ;
222+ }
223+
212224 // Animators only support up to 32 params
213225 private const int k_MaxAnimationParams = 32 ;
214226
@@ -276,13 +288,10 @@ public override void OnDestroy()
276288 base . OnDestroy ( ) ;
277289 }
278290
279-
280291 private List < int > m_ParametersToUpdate ;
281-
282292 private List < ulong > m_ClientSendList ;
283293 private ClientRpcParams m_ClientRpcParams ;
284294
285-
286295 public override void OnNetworkSpawn ( )
287296 {
288297 if ( IsOwner || IsServer )
@@ -439,7 +448,7 @@ private void OnClientConnectedCallback(ulong playerId)
439448
440449 internal void CheckForAnimatorChanges ( )
441450 {
442- if ( ! IsOwner )
451+ if ( ! IsOwner && ! IsServerAuthoritative ( ) || IsServerAuthoritative ( ) && ! IsServer )
443452 {
444453 return ;
445454 }
@@ -747,25 +756,32 @@ private unsafe void UpdateAnimationState(AnimationMessage animationState)
747756 }
748757
749758 /// <summary>
750- /// Sever -side animator parameter update request
759+ /// Server -side animator parameter update request
751760 /// The server sets its local parameters and then forwards the message to the remaining clients
752761 /// </summary>
753762 [ ServerRpc ]
754763 private unsafe void SendParametersUpdateServerRpc ( ParametersUpdateMessage parametersUpdate , ServerRpcParams serverRpcParams = default )
755764 {
756- if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
765+ if ( IsServerAuthoritative ( ) )
757766 {
758- return ;
767+ m_NetworkAnimatorStateChangeHandler . SendParameterUpdate ( parametersUpdate ) ;
759768 }
760- UpdateParameters ( parametersUpdate ) ;
761- if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
769+ else
762770 {
763- m_ClientSendList . Clear ( ) ;
764- m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
765- m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
766- m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
767- m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
768- m_NetworkAnimatorStateChangeHandler . SendParameterUpdate ( parametersUpdate , m_ClientRpcParams ) ;
771+ if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
772+ {
773+ return ;
774+ }
775+ UpdateParameters ( parametersUpdate ) ;
776+ if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
777+ {
778+ m_ClientSendList . Clear ( ) ;
779+ m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
780+ m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
781+ m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
782+ m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
783+ m_NetworkAnimatorStateChangeHandler . SendParameterUpdate ( parametersUpdate , m_ClientRpcParams ) ;
784+ }
769785 }
770786 }
771787
@@ -775,33 +791,40 @@ private unsafe void SendParametersUpdateServerRpc(ParametersUpdateMessage parame
775791 [ ClientRpc ]
776792 internal unsafe void SendParametersUpdateClientRpc ( ParametersUpdateMessage parametersUpdate , ClientRpcParams clientRpcParams = default )
777793 {
778- if ( ! IsOwner )
794+ var isServerAuthoritative = IsServerAuthoritative ( ) ;
795+ if ( ! isServerAuthoritative && ! IsOwner || isServerAuthoritative )
779796 {
780797 m_NetworkAnimatorStateChangeHandler . ProcessParameterUpdate ( parametersUpdate ) ;
781798 }
782799 }
783800
784801 /// <summary>
785- /// Sever -side animation state update request
802+ /// Server -side animation state update request
786803 /// The server sets its local state and then forwards the message to the remaining clients
787804 /// </summary>
788805 [ ServerRpc ]
789806 private unsafe void SendAnimStateServerRpc ( AnimationMessage animSnapshot , ServerRpcParams serverRpcParams = default )
790807 {
791- if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
808+ if ( IsServerAuthoritative ( ) )
792809 {
793- return ;
810+ m_NetworkAnimatorStateChangeHandler . SendAnimationUpdate ( animSnapshot ) ;
794811 }
795-
796- UpdateAnimationState ( animSnapshot ) ;
797- if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
812+ else
798813 {
799- m_ClientSendList . Clear ( ) ;
800- m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
801- m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
802- m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
803- m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
804- m_NetworkAnimatorStateChangeHandler . SendAnimationUpdate ( animSnapshot , m_ClientRpcParams ) ;
814+ if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
815+ {
816+ return ;
817+ }
818+ UpdateAnimationState ( animSnapshot ) ;
819+ if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
820+ {
821+ m_ClientSendList . Clear ( ) ;
822+ m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
823+ m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
824+ m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
825+ m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
826+ m_NetworkAnimatorStateChangeHandler . SendAnimationUpdate ( animSnapshot , m_ClientRpcParams ) ;
827+ }
805828 }
806829 }
807830
@@ -811,36 +834,44 @@ private unsafe void SendAnimStateServerRpc(AnimationMessage animSnapshot, Server
811834 [ ClientRpc ]
812835 private unsafe void SendAnimStateClientRpc ( AnimationMessage animSnapshot , ClientRpcParams clientRpcParams = default )
813836 {
814- if ( ! IsOwner )
837+ var isServerAuthoritative = IsServerAuthoritative ( ) ;
838+ if ( ! isServerAuthoritative && ! IsOwner || isServerAuthoritative )
815839 {
816840 UpdateAnimationState ( animSnapshot ) ;
817841 }
818842 }
819843
820844 /// <summary>
821- /// Sever -side trigger state update request
845+ /// Server -side trigger state update request
822846 /// The server sets its local state and then forwards the message to the remaining clients
823847 /// </summary>
824848 [ ServerRpc ]
825849 private void SendAnimTriggerServerRpc ( AnimationTriggerMessage animationTriggerMessage , ServerRpcParams serverRpcParams = default )
826850 {
827- if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
851+ if ( IsServerAuthoritative ( ) )
828852 {
829- return ;
853+ m_NetworkAnimatorStateChangeHandler . SendTriggerUpdate ( animationTriggerMessage ) ;
830854 }
831-
832- // trigger the animation locally on the server...
833- m_Animator . SetBool ( animationTriggerMessage . Hash , animationTriggerMessage . IsTriggerSet ) ;
834-
835- if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
855+ else
836856 {
837- m_ClientSendList . Clear ( ) ;
838- m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
839- m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
840- m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
841- m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
842- m_NetworkAnimatorStateChangeHandler . SendTriggerUpdate ( animationTriggerMessage , m_ClientRpcParams ) ;
857+ if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
858+ {
859+ return ;
860+ }
861+ // trigger the animation locally on the server...
862+ m_Animator . SetBool ( animationTriggerMessage . Hash , animationTriggerMessage . IsTriggerSet ) ;
863+
864+ if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
865+ {
866+ m_ClientSendList . Clear ( ) ;
867+ m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
868+ m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
869+ m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
870+ m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
871+ m_NetworkAnimatorStateChangeHandler . SendTriggerUpdate ( animationTriggerMessage , m_ClientRpcParams ) ;
872+ }
843873 }
874+
844875 }
845876
846877 /// <summary>
@@ -852,7 +883,8 @@ private void SendAnimTriggerServerRpc(AnimationTriggerMessage animationTriggerMe
852883 [ ClientRpc ]
853884 internal void SendAnimTriggerClientRpc ( AnimationTriggerMessage animationTriggerMessage , ClientRpcParams clientRpcParams = default )
854885 {
855- if ( ! IsOwner )
886+ var isServerAuthoritative = IsServerAuthoritative ( ) ;
887+ if ( ! isServerAuthoritative && ! IsOwner || isServerAuthoritative )
856888 {
857889 m_Animator . SetBool ( animationTriggerMessage . Hash , animationTriggerMessage . IsTriggerSet ) ;
858890 }
@@ -869,10 +901,11 @@ public void SetTrigger(string triggerName)
869901
870902 /// <inheritdoc cref="SetTrigger(string)" />
871903 /// <param name="hash">The hash for the trigger to activate</param>
872- /// <param name="reset">If true, resets the trigger</param>
904+ /// <param name="setTrigger">sets ( true) or resets (false) the trigger. The default is to set it (true). </param>
873905 public void SetTrigger ( int hash , bool setTrigger = true )
874906 {
875- if ( IsOwner )
907+ var isServerAuthoritative = IsServerAuthoritative ( ) ;
908+ if ( IsOwner && ! isServerAuthoritative || IsServer && isServerAuthoritative )
876909 {
877910 var animTriggerMessage = new AnimationTriggerMessage ( ) { Hash = hash , IsTriggerSet = setTrigger } ;
878911 if ( IsServer )
0 commit comments