public void Update() { // Check for Join/Leave Session while (m_join_messages.Count > 0) { JoinMessage msg = m_join_messages.Dequeue(); Session s = new Session(); if (!m_session_mgr.Exists(msg.scene_name)) { // CreateSession s = m_session_mgr.CreateSession(m_name_to_path[msg.scene_name], OpenSceneMode.Additive); } if (s) { s.AddClient(msg.client); foreach (SceneManagerClient smc in clients) { SendJoinMsg(smc, msg); } } } while (m_leave_messages.Count > 0) { LeaveMessage msg = m_leave_messages.Dequeue(); Session s = m_session_mgr.GetSessionBySceneName(msg.scene_name); if (s) { s.RemoveClient(msg.client); if (!(s.GetClientSize() > 0)) { // Save Scene // EditorSceneManager.Save // DestroySession m_session_mgr.DestroySession(m_session_mgr.GetSessionBySceneName(msg.scene_name)); } foreach (SceneManagerClient smc in clients) { SendLeaveMsg(smc, msg); } } } while (m_sync_scene_messages.Count > 0) { // Grab all objects in the scene and send them to the client to map SyncSceneMessage msg = m_sync_scene_messages.Dequeue(); Session s = m_session_mgr.GetSessionBySceneName(msg.scene_name); SyncSceneMessage sync_msg = new SyncSceneMessage(); sync_msg.scene_name = s.Scene.name; sync_msg.client_id = 0; sync_msg.objects = s.Scene.GetRootGameObjects(); SceneManagerClient client = clients.Find(x => x.client_id == msg.client_id); SendSyncSceneMsg(client, sync_msg); } while (m_lock_obj_messages.Count > 0) { LockObjectMessage msg = m_lock_obj_messages.Dequeue(); Session s = m_session_mgr.GetSessionBySceneName(msg.scene_name); if (s) { s.LockObject(msg.object_id, msg.lock_info.client_info); //foreach (SceneManagerClient smc in clients) //{ // SendLockObjMsg(smc, msg); //} } } while (m_unlock_obj_messages.Count > 0) { UnlockObjectMessage msg = m_unlock_obj_messages.Dequeue(); Session s = m_session_mgr.GetSessionBySceneName(msg.scene_name); if (s) { s.UnlockObject(msg.object_id, msg.lock_info.client_info); //foreach (SceneManagerClient smc in clients) //{ // SendUnlockObjMsg(smc, msg); //} } } while (m_sync_obj_messages.Count > 0) { SyncObjectMessage msg = m_sync_obj_messages.Dequeue(); Session s = m_session_mgr.GetSessionBySceneName(msg.scene_name); if (s) { s.UpdateObject(msg); foreach (SceneManagerClient smc in clients) { SendSyncObjectMessage(smc, msg); } } } m_session_mgr.Update(); }
public void ReceiveSyncSceneMsg(SyncSceneMessage msg) { m_sync_scene_messages.Enqueue(msg); }
public void Update() { // Check for Join/Leave Session while (m_join_messages.Count > 0) { JoinMessage msg = m_join_messages.Dequeue(); if (msg.scene_name == scene_name) { session.AddClient(msg.client); if (msg.client.client_id == client_id) { SyncSceneMessage sync_msg = new SyncSceneMessage(); sync_msg.scene_name = scene_name; sync_msg.client_id = client_id; SendSyncSceneMsg(server, sync_msg); } } } while (m_leave_messages.Count > 0) { LeaveMessage msg = m_leave_messages.Dequeue(); if (msg.scene_name == scene_name) { session.RemoveClient(msg.client); } } while (m_sync_scene_messages.Count > 0) { // Check if the given objects are in the client // Map the Client's ObjectID's to the Server's ObjectID's // Set Client Objects as copies of Server Objects // TODO: Create an object if it's not present on Client SyncSceneMessage msg = m_sync_scene_messages.Dequeue(); if (msg.scene_name == scene_name) { GameObject[] objs = session.GetGameObjects(); foreach (GameObject obj in objs) { Object.DestroyImmediate(obj); } foreach (GameObject obj in msg.objects) { GameObject g_obj = Object.Instantiate(obj); ClientToServerID[g_obj.GetInstanceID()] = obj.GetInstanceID(); ServerToClientID[obj.GetInstanceID()] = g_obj.GetInstanceID(); Component[] server_comps = obj.GetComponents(typeof(Component)); Component[] client_comps = g_obj.GetComponents(typeof(Component)); for (int i = 0; i < client_comps.Length; ++i) { ClientToServerID[client_comps[i].GetInstanceID()] = server_comps[i].GetInstanceID(); ServerToClientID[server_comps[i].GetInstanceID()] = client_comps[i].GetInstanceID(); } } } } // Check for Locked/Unlocked Object(s) while (m_lock_obj_messages.Count > 0) { LockObjectMessage msg = m_lock_obj_messages.Dequeue(); if (msg.scene_name == scene_name) { session.LockObject(msg.object_id, msg.lock_info.client_info); } } while (m_unlock_obj_messages.Count > 0) { UnlockObjectMessage msg = m_unlock_obj_messages.Dequeue(); if (msg.scene_name == scene_name) { session.UnlockObject(msg.object_id, msg.lock_info.client_info); } } // Check for SyncObjects while (m_sync_obj_messages.Count > 0) { SyncObjectMessage msg = m_sync_obj_messages.Dequeue(); if (msg.scene_name == scene_name) { msg.object_id = GetClientObjID(msg.object_id); if (msg.client_info.client_id != client_id) { session.UpdateObject(msg); } } } // If any of those checked, update log //Object[] obj = Object.FindObjectsOfType(typeof(Component)); }
public void SendSyncSceneMsg(SceneManagerClient client, SyncSceneMessage msg) { client.RecieveSyncSceneMsg(msg); }
public void SendSyncSceneMsg(SceneManagerServer server, SyncSceneMessage msg) { server.ReceiveSyncSceneMsg(msg); }