82 lines
2.9 KiB
C#
82 lines
2.9 KiB
C#
using FishNet.Connection;
|
|
using FishNet.Managing.Server;
|
|
using FishNet.Object;
|
|
using UnityEngine;
|
|
|
|
namespace FishNet.Observing
|
|
{
|
|
/// <summary>
|
|
/// Condition a connection must meet to be added as an observer.
|
|
/// This class can be inherited from for custom conditions.
|
|
/// </summary>
|
|
public abstract class ObserverCondition : ScriptableObject
|
|
{
|
|
#region Public.
|
|
/// <summary>
|
|
/// NetworkObject this condition is for.
|
|
/// </summary>
|
|
[HideInInspector]
|
|
public NetworkObject NetworkObject;
|
|
#endregion
|
|
|
|
#region Private.
|
|
/// <summary>
|
|
/// True if this condition is enabled.
|
|
/// </summary>
|
|
private bool _isEnabled = true;
|
|
/// <summary>
|
|
/// Gets the enabled state of this condition.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public bool GetIsEnabled() => _isEnabled;
|
|
/// <summary>
|
|
/// Sets the enabled state of this condition.
|
|
/// If the state has changed observers will be rebuilt
|
|
/// for this object.
|
|
/// </summary>
|
|
/// <param name="value"></param>
|
|
public void SetIsEnabled(bool value)
|
|
{
|
|
if (value == GetIsEnabled())
|
|
return;
|
|
|
|
_isEnabled = value;
|
|
//No object to rebuild for.
|
|
if (NetworkObject == null)
|
|
return;
|
|
|
|
ServerObjects so = NetworkObject?.ServerManager?.Objects;
|
|
if (so != null)
|
|
so.RebuildObservers(NetworkObject);
|
|
}
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Initializes this script for use.
|
|
/// </summary>
|
|
/// <param name="networkObject"></param>
|
|
public virtual void InitializeOnce(NetworkObject networkObject)
|
|
{
|
|
NetworkObject = networkObject;
|
|
}
|
|
/// <summary>
|
|
/// Returns if the object which this condition resides should be visible to connection.
|
|
/// </summary>
|
|
/// <param name="connection">Connection which the condition is being checked for.</param>
|
|
/// <param name="currentlyAdded">True if the connection currently has visibility of this object.</param>
|
|
/// <param name="notProcessed">True if the condition was not processed. This can be used to skip processing for performance. While output as true this condition result assumes the previous ConditionMet value.</param>
|
|
public abstract bool ConditionMet(NetworkConnection connection, bool currentlyAdded, out bool notProcessed);
|
|
/// <summary>
|
|
/// True if the condition requires regular updates.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public abstract bool Timed();
|
|
/// <summary>
|
|
/// Creates a clone of this condition to be instantiated.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public abstract ObserverCondition Clone();
|
|
|
|
}
|
|
}
|