using System.Collections.Generic;
using UnityEngine;
namespace Unity.Netcode
{
public enum SessionModeTypes
{
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 SessionModeTypes SessionModeType { 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;
SessionModeType = networkManager.NetworkConfig.SessionMode;
if (SessionModeType == SessionModeTypes.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;
}
}
}