Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 35 additions & 9 deletions MLAPI-Editor/NetworkingManagerEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
using UnityEditorInternal;
using MLAPI;
using MLAPI.Transports;
using UnityEditor.Callbacks;

[CustomEditor(typeof(NetworkingManager), true)]
[CanEditMultipleObjects]
Expand All @@ -22,7 +21,7 @@ public class NetworkingManagerEditor : Editor

// NetworkConfig fields
private SerializedProperty protocolVersionProperty;
private SerializedProperty allowRuntimeSceneChanges;
private SerializedProperty allowRuntimeSceneChangesProperty;
private SerializedProperty networkTransportProperty;
private SerializedProperty receiveTickrateProperty;
private SerializedProperty maxReceiveEventsPerTickRateProperty;
Expand All @@ -38,6 +37,7 @@ public class NetworkingManagerEditor : Editor
private SerializedProperty createPlayerPrefabProperty;
private SerializedProperty forceSamePrefabsProperty;
private SerializedProperty usePrefabSyncProperty;
private SerializedProperty enableSceneManagementProperty;
private SerializedProperty recycleNetworkIdsProperty;
private SerializedProperty networkIdRecycleDelayProperty;
private SerializedProperty rpcHashSizeProperty;
Expand Down Expand Up @@ -100,7 +100,7 @@ private void Init()

// NetworkConfig properties
protocolVersionProperty = networkConfigProperty.FindPropertyRelative("ProtocolVersion");
allowRuntimeSceneChanges = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
allowRuntimeSceneChangesProperty = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
networkTransportProperty = networkConfigProperty.FindPropertyRelative("NetworkTransport");
receiveTickrateProperty = networkConfigProperty.FindPropertyRelative("ReceiveTickrate");
maxReceiveEventsPerTickRateProperty = networkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
Expand All @@ -116,6 +116,7 @@ private void Init()
createPlayerPrefabProperty = networkConfigProperty.FindPropertyRelative("CreatePlayerPrefab");
forceSamePrefabsProperty = networkConfigProperty.FindPropertyRelative("ForceSamePrefabs");
usePrefabSyncProperty = networkConfigProperty.FindPropertyRelative("UsePrefabSync");
enableSceneManagementProperty = networkConfigProperty.FindPropertyRelative("EnableSceneManagement");
recycleNetworkIdsProperty = networkConfigProperty.FindPropertyRelative("RecycleNetworkIds");
networkIdRecycleDelayProperty = networkConfigProperty.FindPropertyRelative("NetworkIdRecycleDelay");
rpcHashSizeProperty = networkConfigProperty.FindPropertyRelative("RpcHashSize");
Expand All @@ -138,7 +139,7 @@ private void CheckNullProperties()

// NetworkConfig properties
protocolVersionProperty = networkConfigProperty.FindPropertyRelative("ProtocolVersion");
allowRuntimeSceneChanges = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
allowRuntimeSceneChangesProperty = networkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
networkTransportProperty = networkConfigProperty.FindPropertyRelative("NetworkTransport");
receiveTickrateProperty = networkConfigProperty.FindPropertyRelative("ReceiveTickrate");
maxReceiveEventsPerTickRateProperty = networkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
Expand All @@ -154,6 +155,7 @@ private void CheckNullProperties()
createPlayerPrefabProperty = networkConfigProperty.FindPropertyRelative("CreatePlayerPrefab");
forceSamePrefabsProperty = networkConfigProperty.FindPropertyRelative("ForceSamePrefabs");
usePrefabSyncProperty = networkConfigProperty.FindPropertyRelative("UsePrefabSync");
enableSceneManagementProperty = networkConfigProperty.FindPropertyRelative("EnableSceneManagement");
recycleNetworkIdsProperty = networkConfigProperty.FindPropertyRelative("RecycleNetworkIds");
networkIdRecycleDelayProperty = networkConfigProperty.FindPropertyRelative("NetworkIdRecycleDelay");
rpcHashSizeProperty = networkConfigProperty.FindPropertyRelative("RpcHashSize");
Expand Down Expand Up @@ -250,8 +252,11 @@ public override void OnInspectorGUI()
EditorGUILayout.Space();
networkPrefabsList.DoLayoutList();

registeredScenesList.DoLayoutList();
EditorGUILayout.Space();
using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
{
registeredScenesList.DoLayoutList();
EditorGUILayout.Space();
}


EditorGUILayout.LabelField("General", EditorStyles.boldLabel);
Expand Down Expand Up @@ -315,7 +320,23 @@ public override void OnInspectorGUI()
EditorGUILayout.LabelField("Spawning", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(createPlayerPrefabProperty);
EditorGUILayout.PropertyField(forceSamePrefabsProperty);
EditorGUILayout.PropertyField(usePrefabSyncProperty);

using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
{
bool value = networkingManager.NetworkConfig.UsePrefabSync;

if (!networkingManager.NetworkConfig.EnableSceneManagement)
{
usePrefabSyncProperty.boolValue = true;
}

EditorGUILayout.PropertyField(usePrefabSyncProperty);

if (!networkingManager.NetworkConfig.EnableSceneManagement)
{
usePrefabSyncProperty.boolValue = value;
}
}

EditorGUILayout.PropertyField(recycleNetworkIdsProperty);

Expand All @@ -328,8 +349,13 @@ public override void OnInspectorGUI()
EditorGUILayout.PropertyField(rpcHashSizeProperty);

EditorGUILayout.LabelField("Scene Management", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(loadSceneTimeOutProperty);
EditorGUILayout.PropertyField(allowRuntimeSceneChanges);
EditorGUILayout.PropertyField(enableSceneManagementProperty);

using (new EditorGUI.DisabledScope(!networkingManager.NetworkConfig.EnableSceneManagement))
{
EditorGUILayout.PropertyField(loadSceneTimeOutProperty);
EditorGUILayout.PropertyField(allowRuntimeSceneChangesProperty);
}

EditorGUILayout.LabelField("Cryptography", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(enableEncryptionProperty);
Expand Down
10 changes: 10 additions & 0 deletions MLAPI/Configuration/NetworkConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,13 @@ public class NetworkConfig
[Tooltip("Ensures that NetworkedVars can be read even if a client accidental writes where its not allowed to. This will cost some CPU time and bandwidth")]
public bool EnsureNetworkedVarLengthSafety = false;
/// <summary>
/// Enables scene management. This will allow network scene switches and automatic scene diff corrections upon connect.
/// SoftSynced scene objects wont work with this disabled. That means that disabling SceneManagement also enables PrefabSync.
/// </summary>
[Tooltip("Enables scene management. This will allow network scene switches and automatic scene diff corrections upon connect.\n" +
"SoftSynced scene objects wont work with this disabled. That means that disabling SceneManagement also enables PrefabSync.")]
public bool EnableSceneManagement = true;
/// <summary>
/// Whether or not the MLAPI should check for differences in the prefabs at connection.
/// If you dynamically add prefabs at runtime, turn this OFF
/// </summary>
Expand Down Expand Up @@ -243,6 +250,7 @@ public string ToBase64()
writer.WriteBits((byte)config.RpcHashSize, 3);
writer.WriteBool(ForceSamePrefabs);
writer.WriteBool(UsePrefabSync);
writer.WriteBool(EnableSceneManagement);
writer.WriteBool(RecycleNetworkIds);
writer.WriteSinglePacked(NetworkIdRecycleDelay);
writer.WriteBool(EnableNetworkedVar);
Expand Down Expand Up @@ -290,6 +298,7 @@ public void FromBase64(string base64)
config.RpcHashSize = (HashSize)reader.ReadBits(3);
config.ForceSamePrefabs = reader.ReadBool();
config.UsePrefabSync = reader.ReadBool();
config.EnableSceneManagement = reader.ReadBool();
config.RecycleNetworkIds = reader.ReadBool();
config.NetworkIdRecycleDelay = reader.ReadSinglePacked();
config.EnableNetworkedVar = reader.ReadBool();
Expand Down Expand Up @@ -339,6 +348,7 @@ public ulong GetConfig(bool cache = true)
writer.WriteBool(EnableNetworkedVar);
writer.WriteBool(ForceSamePrefabs);
writer.WriteBool(UsePrefabSync);
writer.WriteBool(EnableSceneManagement);
writer.WriteBool(EnsureNetworkedVarLengthSafety);
writer.WriteBool(EnableEncryption);
writer.WriteBool(SignKeyExchange);
Expand Down
42 changes: 22 additions & 20 deletions MLAPI/Core/NetworkingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -368,16 +368,19 @@ private void Init(bool server)
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Importing of certificate failed: " + ex.ToString());
}

NetworkConfig.RegisteredScenes.Sort();

for (int i = 0; i < NetworkConfig.RegisteredScenes.Count; i++)
if (NetworkConfig.EnableSceneManagement)
{
NetworkSceneManager.registeredSceneNames.Add(NetworkConfig.RegisteredScenes[i]);
NetworkSceneManager.sceneIndexToString.Add((uint) i, NetworkConfig.RegisteredScenes[i]);
NetworkSceneManager.sceneNameToIndex.Add(NetworkConfig.RegisteredScenes[i], (uint) i);
}
NetworkConfig.RegisteredScenes.Sort();

for (int i = 0; i < NetworkConfig.RegisteredScenes.Count; i++)
{
NetworkSceneManager.registeredSceneNames.Add(NetworkConfig.RegisteredScenes[i]);
NetworkSceneManager.sceneIndexToString.Add((uint)i, NetworkConfig.RegisteredScenes[i]);
NetworkSceneManager.sceneNameToIndex.Add(NetworkConfig.RegisteredScenes[i], (uint)i);
}

NetworkSceneManager.SetCurrentSceneIndex();
NetworkSceneManager.SetCurrentSceneIndex();
}

for (int i = 0; i < NetworkConfig.NetworkedPrefabs.Count; i++)
{
Expand Down Expand Up @@ -913,16 +916,13 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
}

#region INTERNAL MESSAGE

switch (messageType)
{
case MLAPIConstants.MLAPI_CONNECTION_REQUEST:
if (IsServer)
InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
if (IsServer) InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
break;
case MLAPIConstants.MLAPI_CONNECTION_APPROVED:
if (IsClient)
InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
if (IsClient) InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
break;
case MLAPIConstants.MLAPI_ADD_OBJECT:
if (IsClient) InternalMessageHandler.HandleAddObject(clientId, messageStream);
Expand All @@ -931,7 +931,7 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
if (IsClient) InternalMessageHandler.HandleDestroyObject(clientId, messageStream);
break;
case MLAPIConstants.MLAPI_SWITCH_SCENE:
if (IsClient) InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
if (IsClient && NetworkConfig.EnableSceneManagement) InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
break;
case MLAPIConstants.MLAPI_CHANGE_OWNER:
if (IsClient) InternalMessageHandler.HandleChangeOwner(clientId, messageStream);
Expand Down Expand Up @@ -987,13 +987,12 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
break;
#endif
case MLAPIConstants.MLAPI_CLIENT_SWITCH_SCENE_COMPLETED:
if (IsServer) InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
if (IsServer && NetworkConfig.EnableSceneManagement) InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
break;
default:
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Read unrecognized messageType " + messageType);
break;
}

#endregion

NetworkProfiler.EndEvent();
Expand Down Expand Up @@ -1154,8 +1153,11 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
{
writer.WriteUInt64Packed(clientId);

writer.WriteUInt32Packed(NetworkSceneManager.currentSceneIndex);
writer.WriteByteArray(NetworkSceneManager.currentSceneSwitchProgressGuid.ToByteArray());
if (NetworkConfig.EnableSceneManagement)
{
writer.WriteUInt32Packed(NetworkSceneManager.currentSceneIndex);
writer.WriteByteArray(NetworkSceneManager.currentSceneSwitchProgressGuid.ToByteArray());
}

writer.WriteSinglePacked(Time.realtimeSinceStartup);

Expand Down Expand Up @@ -1185,7 +1187,7 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
writer.WriteUInt64Packed(parent.NetworkId);
}

if (NetworkConfig.UsePrefabSync)
if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync)
{
writer.WriteUInt64Packed(observedObject.PrefabHash);
}
Expand Down Expand Up @@ -1251,7 +1253,7 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
//Does not have a parent
writer.WriteBool(false);

if (NetworkConfig.UsePrefabSync)
if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync)
{
writer.WriteUInt64Packed(playerPrefabHash == null ? NetworkConfig.PlayerPrefabHash.Value : playerPrefabHash.Value);
}
Expand Down
21 changes: 14 additions & 7 deletions MLAPI/Messaging/InternalMessageHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -203,22 +203,29 @@ internal static void HandleConnectionApproved(ulong clientId, Stream stream, flo
using (PooledBitReader reader = PooledBitReader.Get(stream))
{
NetworkingManager.Singleton.LocalClientId = reader.ReadUInt64Packed();

uint sceneIndex = reader.ReadUInt32Packed();
Guid sceneSwitchProgressGuid = new Guid(reader.ReadByteArray());

uint sceneIndex = 0;
Guid sceneSwitchProgressGuid = new Guid();

if (NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement)
{
sceneIndex = reader.ReadUInt32Packed();
sceneSwitchProgressGuid = new Guid(reader.ReadByteArray());
}

bool sceneSwitch = NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement && NetworkSceneManager.HasSceneMismatch(sceneIndex);

float netTime = reader.ReadSinglePacked();
NetworkingManager.Singleton.UpdateNetworkTime(clientId, netTime, receiveTime, true);

NetworkingManager.Singleton.ConnectedClients.Add(NetworkingManager.Singleton.LocalClientId, new NetworkedClient() { ClientId = NetworkingManager.Singleton.LocalClientId });

bool sceneSwitch = NetworkSceneManager.HasSceneMismatch(sceneIndex);

void DelayedSpawnAction(Stream continuationStream)
{
using (PooledBitReader continuationReader = PooledBitReader.Get(continuationStream))
{
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
SpawnManager.DestroySceneObjects();
}
Expand All @@ -245,7 +252,7 @@ void DelayedSpawnAction(Stream continuationStream)
ulong instanceId;
bool softSync;

if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
softSync = false;
instanceId = 0;
Expand Down Expand Up @@ -332,7 +339,7 @@ internal static void HandleAddObject(ulong clientId, Stream stream)
ulong instanceId;
bool softSync;

if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
softSync = false;
instanceId = 0;
Expand Down
5 changes: 2 additions & 3 deletions MLAPI/SceneManagement/NetworkSceneManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System.IO;
using MLAPI.Configuration;
using MLAPI.Exceptions;
using MLAPI.Internal;
using MLAPI.Logging;
using MLAPI.Messaging;
using MLAPI.Security;
Expand Down Expand Up @@ -266,7 +265,7 @@ private static void OnSceneUnloadServer(Guid switchSceneGuid)
writer.WriteUInt64Packed(parent.NetworkId);
}

if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
writer.WriteUInt64Packed(newSceneObjects[i].PrefabHash);

Expand Down Expand Up @@ -312,7 +311,7 @@ private static void OnSceneUnloadServer(Guid switchSceneGuid)

private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStream)
{
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
{
SpawnManager.DestroySceneObjects();

Expand Down
Loading