/// <summary> /// Writes new serialized object in to memory. /// </summary> public static void WriteSerializedObjectToMemory(QNetWorldSerializerObject obj) { if (QNetManager.IsHostActive) // if host is active, we will ignore this one { return; } if (WorldIsSerialized) { Instance.StartCoroutine(InternalFromSerializedObject(obj, () => { })); } else { InternalSerializedObjectsInMemory.Add(obj); } }
private static IEnumerator InternalFromSerializedObject(QNetWorldSerializerObject obj, Action onDone) { var predefined = QNetObjectBehaviour.GetPredefinedObject(obj.Object.ObjectIdentity); if (predefined != null) { if (predefined.Prefab != null && predefined.Prefab.PrefabIdentity != obj.Object.PrefabIdentity) { JEMLogger.LogError("Local predefined object does not have the same prefab identity as server."); } // update predefined object transform predefined.transform.position = obj.Object.Position; predefined.transform.rotation = obj.Object.Rotation; // identity predefined.UpdateIdentity(predefined.ObjectIdentity, obj.Object.OwnerIdentity); // call network methods predefined.OnInternalSpawned(); predefined.OnNetworkActive(); // scale? predefined.transform.localScale = obj.Object.Scale; // de-serialize server state predefined.DeSerializeServerState(obj.SerializedServerState); // activate predefined object predefined.gameObject.SetActive(true); yield return(predefined); // manual recycling QNetManager.Client.OriginalClient.Recycle(obj.SerializedServerState.GetMessage()); onDone.Invoke(); yield break; } var prefab = QNetManager.Database.GetPrefab(obj.Object.PrefabIdentity); if (prefab == null) { JEMLogger.Log( $"World serializer is trying to create object but prefab of given id not exists in database. ({obj.Object.PrefabIdentity})"); // manual recycling QNetManager.Client.OriginalClient.Recycle(obj.SerializedServerState.GetMessage()); onDone.Invoke(); yield break; } // create local instance of received var behaviour = QNetObjectBehaviour.InternalSpawn(obj.Object.ObjectIdentity, prefab, obj.Object.Position, obj.Object.Rotation, obj.Object.OwnerIdentity); yield return(behaviour); if (behaviour != null) { // scale? behaviour.transform.localScale = obj.Object.Scale; // de-serialize server state behaviour.DeSerializeServerState(obj.SerializedServerState); // add created object to local array. InternalSerializedAndInstancedObjects.Add(behaviour); } // ignore, if system fail to spawn new object (most likely because of duplicate) // manual recycling QNetManager.Client.OriginalClient.Recycle(obj.SerializedServerState.GetMessage()); onDone.Invoke(); }