Ejemplo n.º 1
0
    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();
    }
Ejemplo n.º 2
0
 public void ReceiveSyncSceneMsg(SyncSceneMessage msg)
 {
     m_sync_scene_messages.Enqueue(msg);
 }
Ejemplo n.º 3
0
    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));
    }
Ejemplo n.º 4
0
 public void SendSyncSceneMsg(SceneManagerClient client, SyncSceneMessage msg)
 {
     client.RecieveSyncSceneMsg(msg);
 }
Ejemplo n.º 5
0
 public void SendSyncSceneMsg(SceneManagerServer server, SyncSceneMessage msg)
 {
     server.ReceiveSyncSceneMsg(msg);
 }