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 } }