diff --git a/MLAPI/MonoBehaviours/Core/NetworkedObject.cs b/MLAPI/MonoBehaviours/Core/NetworkedObject.cs index 09dfdf7..e488300 100644 --- a/MLAPI/MonoBehaviours/Core/NetworkedObject.cs +++ b/MLAPI/MonoBehaviours/Core/NetworkedObject.cs @@ -9,7 +9,7 @@ namespace MLAPI.MonoBehaviours.Core /// A component used to identify that a GameObject is networked /// [AddComponentMenu("MLAPI/NetworkedObject", -99)] - public class NetworkedObject : MonoBehaviour + public sealed class NetworkedObject : MonoBehaviour { /// /// Gets the unique ID of this object that is synced across the network @@ -62,6 +62,7 @@ namespace MLAPI.MonoBehaviours.Core /// /// Gets or sets if this object should be replicated across the network. Can only be changed before the object is spawned /// + [SerializeField] public bool ServerOnly = false; /// /// Gets if this object is part of a pool @@ -108,13 +109,24 @@ namespace MLAPI.MonoBehaviours.Core } } + /// + /// Gets if the object has yet been spawned across the network + /// + public bool isSpawned + { + get + { + return _isSpawned; + } + } + internal bool _isSpawned = false; + internal bool sceneObject = false; + private void OnDestroy() { SpawnManager.OnDestroyObject(NetworkId, false); } - internal bool isSpawned = false; - /// /// Spawns this GameObject across the network. Can only be called from the Server /// diff --git a/MLAPI/MonoBehaviours/Core/NetworkingManager.cs b/MLAPI/MonoBehaviours/Core/NetworkingManager.cs index 40c7ae1..dc73595 100644 --- a/MLAPI/MonoBehaviours/Core/NetworkingManager.cs +++ b/MLAPI/MonoBehaviours/Core/NetworkingManager.cs @@ -80,8 +80,8 @@ namespace MLAPI.MonoBehaviours.Core } } internal HashSet pendingClients; - internal bool isServer; - internal bool isClient; + internal bool _isServer; + internal bool _isClient; /// /// Gets if we are running as host /// @@ -92,6 +92,23 @@ namespace MLAPI.MonoBehaviours.Core return isServer && isClient; } } + + public bool isClient + { + get + { + return _isClient; + } + } + + public bool isServer + { + get + { + return _isServer; + } + } + private bool isListening; private byte[] messageBuffer; internal int serverClientId; @@ -192,6 +209,8 @@ namespace MLAPI.MonoBehaviours.Core { uint networkId = SpawnManager.GetNetworkObjectId(); SpawnManager.spawnedObjects.Add(networkId, sceneObjects[i]); + sceneObjects[i]._isSpawned = true; + sceneObjects[i].sceneObject = true; } } @@ -287,8 +306,8 @@ namespace MLAPI.MonoBehaviours.Core } HostTopology hostTopology = new HostTopology(cConfig, NetworkConfig.MaxConnections); hostId = NetworkTransport.AddHost(hostTopology, NetworkConfig.Port); - isServer = true; - isClient = false; + _isServer = true; + _isClient = false; isListening = true; if (OnServerStarted != null) @@ -305,8 +324,8 @@ namespace MLAPI.MonoBehaviours.Core HostTopology hostTopology = new HostTopology(cConfig, NetworkConfig.MaxConnections); hostId = NetworkTransport.AddHost(hostTopology, 0, null); - isServer = false; - isClient = true; + _isServer = false; + _isClient = true; isListening = true; serverClientId = NetworkTransport.Connect(hostId, NetworkConfig.Address, NetworkConfig.Port, 0, out error); } @@ -334,6 +353,7 @@ namespace MLAPI.MonoBehaviours.Core NetworkTransport.Disconnect(hostId, clientId, out error); } } + _isServer = false; Shutdown(); } @@ -342,6 +362,8 @@ namespace MLAPI.MonoBehaviours.Core /// public void StopHost() { + _isClient = false; + _isServer = false; StopServer(); //We don't stop client since we dont actually have a transport connection to our own host. We just handle host messages directly in the MLAPI } @@ -351,6 +373,7 @@ namespace MLAPI.MonoBehaviours.Core /// public void StopClient() { + _isClient = false; NetworkTransport.Disconnect(hostId, serverClientId, out error); Shutdown(); } @@ -371,8 +394,8 @@ namespace MLAPI.MonoBehaviours.Core } HostTopology hostTopology = new HostTopology(cConfig, NetworkConfig.MaxConnections); hostId = NetworkTransport.AddHost(hostTopology, NetworkConfig.Port, null); - isServer = true; - isClient = true; + _isServer = true; + _isClient = true; isListening = true; connectedClients.Add(-1, new NetworkedClient() { ClientId = -1 }); if(NetworkConfig.HandleObjectSpawning) @@ -408,8 +431,8 @@ namespace MLAPI.MonoBehaviours.Core private void Shutdown() { isListening = false; - isClient = false; - isServer = false; + _isClient = false; + _isServer = false; NetworkTransport.Shutdown(); } @@ -752,7 +775,7 @@ namespace MLAPI.MonoBehaviours.Core } if(NetworkConfig.HandleObjectSpawning) { - SpawnManager.DestroyUnspawnedObjects(); + SpawnManager.DestroySceneObjects(); int objectCount = messageReader.ReadInt32(); for (int i = 0; i < objectCount; i++) { diff --git a/MLAPI/NetworkingManagerComponents/Core/SpawnManager.cs b/MLAPI/NetworkingManagerComponents/Core/SpawnManager.cs index acbc95a..8dcaf58 100644 --- a/MLAPI/NetworkingManagerComponents/Core/SpawnManager.cs +++ b/MLAPI/NetworkingManagerComponents/Core/SpawnManager.cs @@ -65,12 +65,12 @@ namespace MLAPI.NetworkingManagerComponents.Core } } - internal static void DestroyUnspawnedObjects() + internal static void DestroySceneObjects() { NetworkedObject[] netObjects = MonoBehaviour.FindObjectsOfType(); for (int i = 0; i < netObjects.Length; i++) { - if (!netObjects[i].isSpawned) + if (netObjects[i].sceneObject) MonoBehaviour.Destroy(netObjects[i].gameObject); } } @@ -96,6 +96,7 @@ namespace MLAPI.NetworkingManagerComponents.Core netObject.ownerClientId = ownerId; netObject.transform.position = position; netObject.transform.rotation = rotation; + netObject._isSpawned = true; spawnedObjects.Add(netObject.NetworkId, netObject); netObject.InvokeBehaviourNetworkSpawn(); @@ -121,6 +122,7 @@ namespace MLAPI.NetworkingManagerComponents.Core netObject.networkId = networkId; } netObject._isPlayerObject = true; + netObject._isSpawned = true; netManager.connectedClients[clientId].PlayerObject = go; spawnedObjects.Add(netObject.NetworkId, netObject); netObject.InvokeBehaviourNetworkSpawn(); @@ -191,7 +193,7 @@ namespace MLAPI.NetworkingManagerComponents.Core uint netId = GetNetworkObjectId(); netObject.networkId = netId; spawnedObjects.Add(netId, netObject); - netObject.isSpawned = true; + netObject._isSpawned = true; if (clientOwnerId != null) { netObject.ownerClientId = clientOwnerId.Value;