using System.Collections.Generic; using UnityEngine; namespace Unity.Netcode { public enum NetworkTopologyTypes { ClientServer, DistributedAuthority } /// /// A NetworkClient /// public class NetworkClient { /// /// Returns true if the session instance is considered a server /// internal bool IsServer { get; set; } /// /// Returns true if the session instance is considered a client /// internal bool IsClient { get; set; } /// /// Returns true if the session instance is considered a host /// internal bool IsHost => IsClient && IsServer; /// /// When true, the client is connected, approved, and synchronized with /// the server. /// internal bool IsConnected { get; set; } /// /// Is true when the client has been approved. /// internal bool IsApproved { get; set; } public NetworkTopologyTypes NetworkTopologyType { get; internal set; } public bool DAHost { get; internal set; } /// /// Is true when the client has been assigned session ownership in distributed authority mode /// public bool IsSessionOwner { get; internal set; } /// /// The ClientId of the NetworkClient /// public ulong ClientId; /// /// The PlayerObject of the Client /// public NetworkObject PlayerObject; /// /// The list of NetworkObject's owned by this client instance /// public List OwnedObjects => IsConnected ? SpawnManager.GetClientOwnedObjects(ClientId) : new List(); internal NetworkSpawnManager SpawnManager { get; private set; } internal bool SetRole(bool isServer, bool isClient, NetworkManager networkManager = null) { ResetClient(isServer, isClient); IsServer = isServer; IsClient = isClient; if (networkManager != null) { SpawnManager = networkManager.SpawnManager; NetworkTopologyType = networkManager.NetworkConfig.NetworkTopology; if (NetworkTopologyType == NetworkTopologyTypes.DistributedAuthority) { DAHost = IsClient && IsServer; // DANGO-TODO: We might allow a dedicated mock CMB server, but for now do not allow this if (!IsClient && IsServer) { Debug.LogError("You cannot start NetworkManager as a server when operating in distributed authority mode!"); return false; } if (DAHost && networkManager.CMBServiceConnection) { Debug.LogError("You cannot start a host when connecting to a distributed authority CMB Service!"); return false; } } } return true; } /// /// Only to be invoked when setting the role. /// This resets the current NetworkClient's properties. /// private void ResetClient(bool isServer, bool isClient) { // If we are niether client nor server, then reset properties (i.e. client has no role) if (!IsServer && !IsClient) { PlayerObject = null; ClientId = 0; IsConnected = false; IsApproved = false; SpawnManager = null; DAHost = false; } } internal void AssignPlayerObject(ref NetworkObject networkObject) { PlayerObject = networkObject; } } }