Skip to content
53 changes: 34 additions & 19 deletions com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
using MLAPI.Transports.Tasks;
using MLAPI.Messaging.Buffering;
using Unity.Profiling;
using UnityEditor.VersionControl;

namespace MLAPI
{
Expand Down Expand Up @@ -96,6 +97,9 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr

internal BufferManager BufferManager { get; private set; }

// Has to have setter for tests
internal IInternalMessageHandler MessageHandler { get; set; }

/// <summary>
/// Gets the networkId of the server
/// </summary>
Expand Down Expand Up @@ -296,6 +300,12 @@ private void Init(bool server)

BufferManager = new BufferManager();

if (MessageHandler == null)
{
// Only create this if it's not already set (like in test cases)
MessageHandler = new InternalMessageHandler(this);
}

NetworkSceneManager.RegisteredSceneNames.Clear();
NetworkSceneManager.SceneIndexToString.Clear();
NetworkSceneManager.SceneNameToIndex.Clear();
Expand Down Expand Up @@ -685,6 +695,11 @@ public void Shutdown()
SpawnManager = null;
}

if (MessageHandler != null)
{
MessageHandler = null;
}

//The Transport is set during Init time, thus it is possible for the Transport to be null
NetworkConfig?.NetworkTransport?.Shutdown();
}
Expand Down Expand Up @@ -1035,68 +1050,68 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel,
case NetworkConstants.CONNECTION_REQUEST:
if (IsServer)
{
InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
MessageHandler.HandleConnectionRequest(clientId, messageStream);
}

break;
case NetworkConstants.CONNECTION_APPROVED:
if (IsClient)
{
InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
MessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
}

break;
case NetworkConstants.ADD_OBJECT:
if (IsClient)
{
InternalMessageHandler.HandleAddObject(clientId, messageStream);
MessageHandler.HandleAddObject(clientId, messageStream);
}

break;
case NetworkConstants.DESTROY_OBJECT:
if (IsClient)
{
InternalMessageHandler.HandleDestroyObject(clientId, messageStream);
MessageHandler.HandleDestroyObject(clientId, messageStream);
}

break;
case NetworkConstants.SWITCH_SCENE:
if (IsClient)
{
InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
MessageHandler.HandleSwitchScene(clientId, messageStream);
}

break;
case NetworkConstants.CHANGE_OWNER:
if (IsClient)
{
InternalMessageHandler.HandleChangeOwner(clientId, messageStream);
MessageHandler.HandleChangeOwner(clientId, messageStream);
}

break;
case NetworkConstants.ADD_OBJECTS:
if (IsClient)
{
InternalMessageHandler.HandleAddObjects(clientId, messageStream);
MessageHandler.HandleAddObjects(clientId, messageStream);
}

break;
case NetworkConstants.DESTROY_OBJECTS:
if (IsClient)
{
InternalMessageHandler.HandleDestroyObjects(clientId, messageStream);
MessageHandler.HandleDestroyObjects(clientId, messageStream);
}

break;
case NetworkConstants.TIME_SYNC:
if (IsClient)
{
InternalMessageHandler.HandleTimeSync(clientId, messageStream, receiveTime);
MessageHandler.HandleTimeSync(clientId, messageStream, receiveTime);
}

break;
case NetworkConstants.NETWORK_VARIABLE_DELTA:
InternalMessageHandler.HandleNetworkVariableDelta(clientId, messageStream, BufferCallback, new PreBufferPreset()
MessageHandler.HandleNetworkVariableDelta(clientId, messageStream, BufferCallback, new PreBufferPreset()
{
AllowBuffer = allowBuffer,
NetworkChannel = networkChannel,
Expand All @@ -1107,7 +1122,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel,
});
break;
case NetworkConstants.NETWORK_VARIABLE_UPDATE:
InternalMessageHandler.HandleNetworkVariableUpdate(clientId, messageStream, BufferCallback, new PreBufferPreset()
MessageHandler.HandleNetworkVariableUpdate(clientId, messageStream, BufferCallback, new PreBufferPreset()
{
AllowBuffer = allowBuffer,
NetworkChannel = networkChannel,
Expand All @@ -1118,15 +1133,15 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel,
});
break;
case NetworkConstants.UNNAMED_MESSAGE:
InternalMessageHandler.HandleUnnamedMessage(clientId, messageStream);
MessageHandler.HandleUnnamedMessage(clientId, messageStream);
break;
case NetworkConstants.NAMED_MESSAGE:
InternalMessageHandler.HandleNamedMessage(clientId, messageStream);
MessageHandler.HandleNamedMessage(clientId, messageStream);
break;
case NetworkConstants.CLIENT_SWITCH_SCENE_COMPLETED:
if (IsServer && NetworkConfig.EnableSceneManagement)
{
InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
MessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
}
else if (!NetworkConfig.EnableSceneManagement)
{
Expand All @@ -1137,7 +1152,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel,
case NetworkConstants.SERVER_LOG:
if (IsServer && NetworkConfig.EnableNetworkLogs)
{
InternalMessageHandler.HandleNetworkLog(clientId, messageStream);
MessageHandler.HandleNetworkLog(clientId, messageStream);
}

break;
Expand All @@ -1153,7 +1168,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel,
}
else
{
InternalMessageHandler.RpcReceiveQueueItem(clientId, messageStream, receiveTime, RpcQueueContainer.QueueItemType.ServerRpc);
MessageHandler.RpcReceiveQueueItem(clientId, messageStream, receiveTime, RpcQueueContainer.QueueItemType.ServerRpc);
}
}

Expand All @@ -1171,7 +1186,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel,
}
else
{
InternalMessageHandler.RpcReceiveQueueItem(clientId, messageStream, receiveTime, RpcQueueContainer.QueueItemType.ClientRpc);
MessageHandler.RpcReceiveQueueItem(clientId, messageStream, receiveTime, RpcQueueContainer.QueueItemType.ClientRpc);
}
}

Expand All @@ -1197,9 +1212,9 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel,
#endif
}

private static void ReceiveCallback(NetworkBuffer messageBuffer, RpcQueueContainer.QueueItemType messageType, ulong clientId, float receiveTime)
private void ReceiveCallback(NetworkBuffer messageBuffer, RpcQueueContainer.QueueItemType messageType, ulong clientId, float receiveTime)
{
InternalMessageHandler.RpcReceiveQueueItem(clientId, messageBuffer, receiveTime, messageType);
MessageHandler.RpcReceiveQueueItem(clientId, messageBuffer, receiveTime, messageType);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System;
using System.IO;
using MLAPI.Messaging.Buffering;

namespace MLAPI.Messaging
{
internal interface IInternalMessageHandler
{
NetworkManager NetworkManager { get; }
void HandleConnectionRequest(ulong clientId, Stream stream);
void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime);
void HandleAddObject(ulong clientId, Stream stream);
void HandleDestroyObject(ulong clientId, Stream stream);
void HandleSwitchScene(ulong clientId, Stream stream);
void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream);
void HandleChangeOwner(ulong clientId, Stream stream);
void HandleAddObjects(ulong clientId, Stream stream);
void HandleDestroyObjects(ulong clientId, Stream stream);
void HandleTimeSync(ulong clientId, Stream stream, float receiveTime);
void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action<ulong, PreBufferPreset> bufferCallback, PreBufferPreset bufferPreset);
void HandleNetworkVariableUpdate(ulong clientId, Stream stream, Action<ulong, PreBufferPreset> bufferCallback, PreBufferPreset bufferPreset);
void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, RpcQueueContainer.QueueItemType queueItemType);
void HandleUnnamedMessage(ulong clientId, Stream stream);
void HandleNamedMessage(ulong clientId, Stream stream);
void HandleNetworkLog(ulong clientId, Stream stream);
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading