From 85c8d8983499bc868744fb3312d216ca61f4be9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 2 Aug 2019 11:28:35 +0200 Subject: [PATCH 1/4] feat: Added option to disable SceneManagement --- MLAPI-Editor/NetworkingManagerEditor.cs | 44 ++++++++++++++++---- MLAPI/Configuration/NetworkConfig.cs | 10 +++++ MLAPI/Core/NetworkingManager.cs | 36 +++++++++------- MLAPI/Messaging/InternalMessageHandler.cs | 21 ++++++---- MLAPI/SceneManagement/NetworkSceneManager.cs | 5 +-- MLAPI/Spawning/SpawnManager.cs | 4 +- 6 files changed, 84 insertions(+), 36 deletions(-) diff --git a/MLAPI-Editor/NetworkingManagerEditor.cs b/MLAPI-Editor/NetworkingManagerEditor.cs index 8e6419b671..faca7e5aca 100644 --- a/MLAPI-Editor/NetworkingManagerEditor.cs +++ b/MLAPI-Editor/NetworkingManagerEditor.cs @@ -6,7 +6,6 @@ using UnityEditorInternal; using MLAPI; using MLAPI.Transports; -using UnityEditor.Callbacks; [CustomEditor(typeof(NetworkingManager), true)] [CanEditMultipleObjects] @@ -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; @@ -38,6 +37,7 @@ public class NetworkingManagerEditor : Editor private SerializedProperty ensureNetworkedVarLengthSafetyProperty; private SerializedProperty forceSamePrefabsProperty; private SerializedProperty usePrefabSyncProperty; + private SerializedProperty enableSceneManagementProperty; private SerializedProperty recycleNetworkIdsProperty; private SerializedProperty networkIdRecycleDelayProperty; private SerializedProperty rpcHashSizeProperty; @@ -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"); @@ -116,6 +116,7 @@ private void Init() ensureNetworkedVarLengthSafetyProperty = networkConfigProperty.FindPropertyRelative("EnsureNetworkedVarLengthSafety"); forceSamePrefabsProperty = networkConfigProperty.FindPropertyRelative("ForceSamePrefabs"); usePrefabSyncProperty = networkConfigProperty.FindPropertyRelative("UsePrefabSync"); + enableSceneManagementProperty = networkConfigProperty.FindPropertyRelative("EnableSceneManagement"); recycleNetworkIdsProperty = networkConfigProperty.FindPropertyRelative("RecycleNetworkIds"); networkIdRecycleDelayProperty = networkConfigProperty.FindPropertyRelative("NetworkIdRecycleDelay"); rpcHashSizeProperty = networkConfigProperty.FindPropertyRelative("RpcHashSize"); @@ -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"); @@ -154,6 +155,7 @@ private void CheckNullProperties() ensureNetworkedVarLengthSafetyProperty = networkConfigProperty.FindPropertyRelative("EnsureNetworkedVarLengthSafety"); forceSamePrefabsProperty = networkConfigProperty.FindPropertyRelative("ForceSamePrefabs"); usePrefabSyncProperty = networkConfigProperty.FindPropertyRelative("UsePrefabSync"); + enableSceneManagementProperty = networkConfigProperty.FindPropertyRelative("EnableSceneManagement"); recycleNetworkIdsProperty = networkConfigProperty.FindPropertyRelative("RecycleNetworkIds"); networkIdRecycleDelayProperty = networkConfigProperty.FindPropertyRelative("NetworkIdRecycleDelay"); rpcHashSizeProperty = networkConfigProperty.FindPropertyRelative("RpcHashSize"); @@ -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); @@ -315,7 +320,23 @@ public override void OnInspectorGUI() EditorGUILayout.LabelField("Spawning", EditorStyles.boldLabel); 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); @@ -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); diff --git a/MLAPI/Configuration/NetworkConfig.cs b/MLAPI/Configuration/NetworkConfig.cs index 7674643de7..c98f3d9dd1 100644 --- a/MLAPI/Configuration/NetworkConfig.cs +++ b/MLAPI/Configuration/NetworkConfig.cs @@ -119,6 +119,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; /// + /// 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. + /// + [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; + /// /// Whether or not the MLAPI should check for differences in the prefabs at connection. /// If you dynamically add prefabs at runtime, turn this OFF /// @@ -237,6 +244,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); @@ -285,6 +293,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(); @@ -334,6 +343,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); diff --git a/MLAPI/Core/NetworkingManager.cs b/MLAPI/Core/NetworkingManager.cs index 27414f064b..5d457dc2af 100644 --- a/MLAPI/Core/NetworkingManager.cs +++ b/MLAPI/Core/NetworkingManager.cs @@ -356,16 +356,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++) { @@ -781,7 +784,7 @@ internal void UpdateNetworkTime(ulong clientId, float netTime, float receiveTime if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo($"Received network time {netTime}, RTT to server is {rtt}, setting offset to {networkTimeOffset} (delta {networkTimeOffset - currentNetworkTimeOffset})"); } - internal void SendConnectionRequest() + internal void SendConnectionRequest() { using (PooledBitStream stream = PooledBitStream.Get()) { @@ -874,7 +877,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); @@ -930,7 +933,7 @@ 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); @@ -1088,8 +1091,11 @@ internal void HandleApproval(ulong clientId, ulong? prefabHash, bool approved, V { 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); @@ -1119,7 +1125,7 @@ internal void HandleApproval(ulong clientId, ulong? prefabHash, bool approved, V writer.WriteUInt64Packed(parent.NetworkId); } - if (NetworkConfig.UsePrefabSync) + if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync) { writer.WriteUInt64Packed(observedObject.PrefabHash); } @@ -1185,7 +1191,7 @@ internal void HandleApproval(ulong clientId, ulong? prefabHash, bool approved, V //Does not have a parrent writer.WriteBool(false); - if (NetworkConfig.UsePrefabSync) + if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync) { writer.WriteUInt64Packed(prefabHash == null ? NetworkConfig.PlayerPrefabHash : prefabHash.Value); } diff --git a/MLAPI/Messaging/InternalMessageHandler.cs b/MLAPI/Messaging/InternalMessageHandler.cs index 5ce16d4cad..63216524a7 100644 --- a/MLAPI/Messaging/InternalMessageHandler.cs +++ b/MLAPI/Messaging/InternalMessageHandler.cs @@ -200,22 +200,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; + + 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(); } @@ -242,7 +249,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; @@ -329,7 +336,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; diff --git a/MLAPI/SceneManagement/NetworkSceneManager.cs b/MLAPI/SceneManagement/NetworkSceneManager.cs index f8200f9822..b66b7f0a07 100644 --- a/MLAPI/SceneManagement/NetworkSceneManager.cs +++ b/MLAPI/SceneManagement/NetworkSceneManager.cs @@ -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; @@ -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); @@ -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(); diff --git a/MLAPI/Spawning/SpawnManager.cs b/MLAPI/Spawning/SpawnManager.cs index 363e00c95b..c065cadfa2 100644 --- a/MLAPI/Spawning/SpawnManager.cs +++ b/MLAPI/Spawning/SpawnManager.cs @@ -247,7 +247,7 @@ internal static NetworkedObject CreateLocalNetworkedObject(bool softCreate, ulon if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("Cannot find parent. Parent objects always have to be spawned and replicated BEFORE the child"); } - if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync || !softCreate) + if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync || !softCreate) { // Create the object if (customSpawnHandlers.ContainsKey(prefabHash)) @@ -419,7 +419,7 @@ internal static void WriteSpawnCallForObject(Serialization.BitStream stream, ulo writer.WriteUInt64Packed(parent.NetworkId); } - if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) + if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) { writer.WriteUInt64Packed(netObject.PrefabHash); } From d88309b3d498907d752222d3321685bf7d19d0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 2 Aug 2019 11:49:46 +0200 Subject: [PATCH 2/4] fix: Fixed compilation on older compilers --- MLAPI/Messaging/InternalMessageHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MLAPI/Messaging/InternalMessageHandler.cs b/MLAPI/Messaging/InternalMessageHandler.cs index 63216524a7..8ed3aab1b1 100644 --- a/MLAPI/Messaging/InternalMessageHandler.cs +++ b/MLAPI/Messaging/InternalMessageHandler.cs @@ -202,7 +202,7 @@ internal static void HandleConnectionApproved(ulong clientId, Stream stream, flo NetworkingManager.Singleton.LocalClientId = reader.ReadUInt64Packed(); uint sceneIndex = 0; - Guid sceneSwitchProgressGuid; + Guid sceneSwitchProgressGuid = new Guid(); if (NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement) { From c5ff6c4f414688a595541a113b2af638bdab78af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 2 Aug 2019 11:28:35 +0200 Subject: [PATCH 3/4] feat: Added option to disable SceneManagement --- MLAPI-Editor/NetworkingManagerEditor.cs | 44 ++++++++++++++++---- MLAPI/Configuration/NetworkConfig.cs | 10 +++++ MLAPI/Core/NetworkingManager.cs | 34 ++++++++------- MLAPI/Messaging/InternalMessageHandler.cs | 21 ++++++---- MLAPI/SceneManagement/NetworkSceneManager.cs | 5 +-- MLAPI/Spawning/SpawnManager.cs | 4 +- 6 files changed, 83 insertions(+), 35 deletions(-) diff --git a/MLAPI-Editor/NetworkingManagerEditor.cs b/MLAPI-Editor/NetworkingManagerEditor.cs index ac8bd7de61..72af7da169 100644 --- a/MLAPI-Editor/NetworkingManagerEditor.cs +++ b/MLAPI-Editor/NetworkingManagerEditor.cs @@ -6,7 +6,6 @@ using UnityEditorInternal; using MLAPI; using MLAPI.Transports; -using UnityEditor.Callbacks; [CustomEditor(typeof(NetworkingManager), true)] [CanEditMultipleObjects] @@ -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; @@ -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; @@ -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"); @@ -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"); @@ -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"); @@ -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"); @@ -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); @@ -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); @@ -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); diff --git a/MLAPI/Configuration/NetworkConfig.cs b/MLAPI/Configuration/NetworkConfig.cs index 3ec67de8f3..f108c00923 100644 --- a/MLAPI/Configuration/NetworkConfig.cs +++ b/MLAPI/Configuration/NetworkConfig.cs @@ -119,6 +119,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; /// + /// 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. + /// + [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; + /// /// Whether or not the MLAPI should check for differences in the prefabs at connection. /// If you dynamically add prefabs at runtime, turn this OFF /// @@ -236,6 +243,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); @@ -283,6 +291,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(); @@ -332,6 +341,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); diff --git a/MLAPI/Core/NetworkingManager.cs b/MLAPI/Core/NetworkingManager.cs index f472e0ab21..2542472ca9 100644 --- a/MLAPI/Core/NetworkingManager.cs +++ b/MLAPI/Core/NetworkingManager.cs @@ -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++) { @@ -905,7 +908,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); @@ -961,7 +964,7 @@ 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); @@ -1129,8 +1132,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); @@ -1160,7 +1166,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); } @@ -1226,7 +1232,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); } diff --git a/MLAPI/Messaging/InternalMessageHandler.cs b/MLAPI/Messaging/InternalMessageHandler.cs index 4442051148..60da5a367d 100644 --- a/MLAPI/Messaging/InternalMessageHandler.cs +++ b/MLAPI/Messaging/InternalMessageHandler.cs @@ -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; + + 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(); } @@ -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; @@ -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; diff --git a/MLAPI/SceneManagement/NetworkSceneManager.cs b/MLAPI/SceneManagement/NetworkSceneManager.cs index f8200f9822..b66b7f0a07 100644 --- a/MLAPI/SceneManagement/NetworkSceneManager.cs +++ b/MLAPI/SceneManagement/NetworkSceneManager.cs @@ -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; @@ -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); @@ -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(); diff --git a/MLAPI/Spawning/SpawnManager.cs b/MLAPI/Spawning/SpawnManager.cs index 363e00c95b..c065cadfa2 100644 --- a/MLAPI/Spawning/SpawnManager.cs +++ b/MLAPI/Spawning/SpawnManager.cs @@ -247,7 +247,7 @@ internal static NetworkedObject CreateLocalNetworkedObject(bool softCreate, ulon if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("Cannot find parent. Parent objects always have to be spawned and replicated BEFORE the child"); } - if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync || !softCreate) + if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync || !softCreate) { // Create the object if (customSpawnHandlers.ContainsKey(prefabHash)) @@ -419,7 +419,7 @@ internal static void WriteSpawnCallForObject(Serialization.BitStream stream, ulo writer.WriteUInt64Packed(parent.NetworkId); } - if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) + if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) { writer.WriteUInt64Packed(netObject.PrefabHash); } From e987e91addd8c5b5d0263b150c8c7b897fe7cf9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 2 Aug 2019 11:49:46 +0200 Subject: [PATCH 4/4] fix: Fixed compilation on older compilers --- MLAPI/Messaging/InternalMessageHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MLAPI/Messaging/InternalMessageHandler.cs b/MLAPI/Messaging/InternalMessageHandler.cs index 60da5a367d..abb475bab8 100644 --- a/MLAPI/Messaging/InternalMessageHandler.cs +++ b/MLAPI/Messaging/InternalMessageHandler.cs @@ -205,7 +205,7 @@ internal static void HandleConnectionApproved(ulong clientId, Stream stream, flo NetworkingManager.Singleton.LocalClientId = reader.ReadUInt64Packed(); uint sceneIndex = 0; - Guid sceneSwitchProgressGuid; + Guid sceneSwitchProgressGuid = new Guid(); if (NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement) {