using FishNet.Component.ColliderRollback;
using FishNet.Managing;
using FishNet.Managing.Client;
using FishNet.Managing.Predicting;
using FishNet.Managing.Scened;
using FishNet.Managing.Server;
using FishNet.Managing.Statistic;
using FishNet.Managing.Timing;
using FishNet.Managing.Transporting;
using FishNet.Utility;
using GameKit.Dependencies.Utilities;
using System;
using System.Linq;
using UnityEngine;
namespace FishNet
{
///
/// Used to globally get information from the first found instance of NetworkManager.
///
public static class InstanceFinder
{
#region Public.
///
/// Returns the first found NetworkManager instance.
///
public static NetworkManager NetworkManager
{
get
{
if (_networkManager == null)
{
int managersCount = NetworkManager.Instances.Count;
//At least one manager.
if (managersCount > 0)
{
_networkManager = NetworkManager.Instances.First();
if (managersCount > 1)
_networkManager.LogWarning($"Multiple NetworkManagers found, the first result will be returned. If you only wish to have one NetworkManager then uncheck 'Allow Multiple' within your NetworkManagers.");
}
//No managers.
else
{
//If application is quitting return null without logging.
if (ApplicationState.IsQuitting())
return null;
//Do not log using NetworkManager extensions, it will try to use InstanceFinder, resulting in this causing a stack overflow.
Debug.Log($"NetworkManager not found in any open scenes.");
}
}
return _networkManager;
}
}
///
/// Returns the first instance of ServerManager.
///
public static ServerManager ServerManager
{
get
{
NetworkManager nm = NetworkManager;
return (nm == null) ? null : nm.ServerManager;
}
}
///
/// Returns the first instance of ClientManager.
///
public static ClientManager ClientManager
{
get
{
NetworkManager nm = NetworkManager;
return (nm == null) ? null : nm.ClientManager;
}
}
///
/// Returns the first instance of TransportManager.
///
public static TransportManager TransportManager
{
get
{
NetworkManager nm = NetworkManager;
return (nm == null) ? null : nm.TransportManager;
}
}
///
/// Returns the first instance of TimeManager.
///
public static TimeManager TimeManager
{
get
{
NetworkManager nm = NetworkManager;
return (nm == null) ? null : nm.TimeManager;
}
}
///
/// Returns the first instance of SceneManager.
///
public static SceneManager SceneManager
{
get
{
NetworkManager nm = NetworkManager;
return (nm == null) ? null : nm.SceneManager;
}
}
///
/// Returns the first instance of RollbackManager.
///
public static RollbackManager RollbackManager
{
get
{
NetworkManager nm = NetworkManager;
return (nm == null) ? null : nm.RollbackManager;
}
}
///
/// Returns the first instance of PredictionManager.
///
public static PredictionManager PredictionManager
{
get
{
NetworkManager nm = NetworkManager;
return (nm == null) ? null : nm.PredictionManager;
}
}
///
/// Returns the first instance of StatisticsManager.
///
public static StatisticsManager StatisticsManager
{
get
{
NetworkManager nm = NetworkManager;
return (nm == null) ? null : nm.StatisticsManager;
}
}
#region Obsoletes
[Obsolete("Use IsClientOnlyStarted. Note the difference between IsClientOnlyInitialized and IsClientOnlyStarted.")]
public static bool IsClientOnly => IsClientOnlyStarted;
[Obsolete("Use IsServerOnlyStarted. Note the difference between IsServerOnlyInitialized and IsServerOnlyStarted.")]
public static bool IsServerOnly => IsServerOnlyStarted;
[Obsolete("Use IsHostStarted. Note the difference between IsHostInitialized and IsHostStarted.")]
public static bool IsHost => IsHostStarted;
[Obsolete("Use IsClientStarted. Note the difference between IsClientInitialized and IsClientStarted.")]
public static bool IsClient => IsClientStarted;
[Obsolete("Use IsServerStarted. Note the difference between IsServerInitialized and IsServerStarted.")]
public static bool IsServer => IsServerStarted;
#endregion
///
/// True if the server is active.
///
public static bool IsServerStarted => (NetworkManager == null) ? false : NetworkManager.IsServerStarted;
///
/// True if only the server is started.
///
public static bool IsServerOnlyStarted => (NetworkManager == null) ? false : NetworkManager.IsServerOnlyStarted;
///
/// True if the client is started and authenticated.
///
public static bool IsClientStarted => (NetworkManager == null) ? false : NetworkManager.IsClientStarted;
///
/// True if only the client is started and authenticated.
///
public static bool IsClientOnlyStarted => (NetworkManager == null) ? false : NetworkManager.IsClientOnlyStarted;
///
/// True if client and server are started.
///
public static bool IsHostStarted => (NetworkManager == null) ? false : NetworkManager.IsHostStarted;
///
/// True if client nor server are started.
///
public static bool IsOffline
{
get
{
return (NetworkManager == null) ? true : NetworkManager.IsOffline;
}
}
#endregion
#region Private.
///
/// NetworkManager instance.
///
private static NetworkManager _networkManager;
#endregion
#region Registered components
///
/// Registers to invoke an action when a specified component becomes registered. Action will invoke immediately if already registered.
///
/// Component type.
/// Action to invoke.
public static void RegisterInvokeOnInstance(Action handler) where T : UnityEngine.Component
{
if (NetworkManager != null)
NetworkManager.RegisterInvokeOnInstance(handler);
}
///
/// Unrgisters to invoke an action when a specified component becomes registered. Action will invoke immediately if already registered.
///
/// Component type.
/// Action to invoke.
public static void UnregisterInvokeOnInstance(Action handler) where T : UnityEngine.Component
{
if (NetworkManager != null)
NetworkManager.UnregisterInvokeOnInstance(handler);
}
///
/// Returns class of type if found within CodegenBase classes.
///
///
///
public static T GetInstance() where T : UnityEngine.Component
{
return (NetworkManager == null) ? default : NetworkManager.GetInstance();
}
///
/// Returns if class of type is registered with the NetworkManager.
///
/// Type to check for.
///
public static bool HasInstance() where T : UnityEngine.Component
{
return (NetworkManager == null) ? false : NetworkManager.HasInstance();
}
///
/// Registers a new component to this NetworkManager.
///
/// Type to register.
/// Reference of the component being registered.
/// True to replace existing references.
public static void RegisterInstance(T component, bool replace = true) where T : UnityEngine.Component
{
if (NetworkManager != null)
NetworkManager.RegisterInstance(component, replace);
}
///
/// Tries to registers a new component to this NetworkManager.
/// This will not register the instance if another already exists.
///
/// Type to register.
/// Reference of the component being registered.
/// True if was able to register, false if an instance is already registered.
public static bool TryRegisterInstance(T component) where T : UnityEngine.Component
{
return (NetworkManager == null) ? false : NetworkManager.TryRegisterInstance(component);
}
///
/// Returns class of type from registered instances.
///
/// Outputted component.
/// Type to get.
/// True if was able to get instance.
public static bool TryGetInstance(out T component) where T : UnityEngine.Component
{
if (NetworkManager == null)
{
component = default;
return false;
}
else
{
return NetworkManager.TryGetInstance(out component);
}
}
///
/// Unregisters a component from this NetworkManager.
///
/// Type to unregister.
public static void UnregisterInstance() where T : UnityEngine.Component
{
if (NetworkManager != null)
NetworkManager.UnregisterInstance();
}
#endregion
}
}