Пример #1
0
        private bool CompareStateUpdates(StateUpdate desObj, StateUpdateObject sup)
        {
            var passed = true;

            passed &= desObj.SiteDrive == sup.siteDrive;
            passed &= desObj.Delete(0) == sup.delete[0];
            passed &= desObj.Poi.Value.Id == sup.poiPlacementObject.id && desObj.Poi.Value.Name == sup.poiPlacementObject.name &&
                      new Vector3(desObj.Poi.Value.Position.Value.X, desObj.Poi.Value.Position.Value.Y,
                                  desObj.Poi.Value.Position.Value.Z) ==
                      sup.poiPlacementObject.position;
            passed &= desObj.Create(0).Value.Id == sup.create[0].id && desObj.Create(0).Value.Owner == sup.create[0].owner &&
                      new Vector3(desObj.Create(0).Value.Position.Value.X, desObj.Create(0).Value.Position.Value.Y,
                                  desObj.Create(0).Value.Position.Value.Z) ==
                      sup.create[0].position && new Vector3(desObj.Create(0).Value.LookDirection.Value.X,
                                                            desObj.Create(0).Value.LookDirection.Value.Y,
                                                            desObj.Create(0).Value.LookDirection.Value.Z) ==
                      sup.create[0].lookDirection;

            passed &= desObj.Update(0).Value.Id == sup.update[0].id && desObj.Update(0).Value.Owner == sup.update[0].owner &&
                      new Vector3(desObj.Update(0).Value.Position.Value.X, desObj.Update(0).Value.Position.Value.Y,
                                  desObj.Update(0).Value.Position.Value.Z) ==
                      sup.update[0].position && new Vector3(desObj.Update(0).Value.LookDirection.Value.X,
                                                            desObj.Update(0).Value.LookDirection.Value.Y,
                                                            desObj.Update(0).Value.LookDirection.Value.Z) ==
                      sup.update[0].lookDirection;

            passed &= desObj.Annotations(0).Value.LineId == sup.annotationObjects[0].lineId && desObj.Annotations(0).Value.UserId == sup.annotationObjects[0].userId &&
                      new Vector3(desObj.Annotations(0).Value.Positions(0).Value.X, desObj.Annotations(0).Value.Positions(0).Value.Y, desObj.Annotations(0).Value.Positions(0).Value.Z) ==
                      sup.annotationObjects[0].positions[0];

            return(passed);
        }
Пример #2
0
        private bool CompareStateUpdates(StateUpdate desObj, StateUpdateObject sup)
        {
            var passed = true;

            passed &= desObj.Delete(0) == sup.delete[0];
            passed &= desObj.Create(0).Value.Id == sup.create[0].id && desObj.Create(0).Value.Owner == sup.create[0].owner &&
                      new Vector3(desObj.Create(0).Value.Position.Value.X, desObj.Create(0).Value.Position.Value.Y,
                                  desObj.Create(0).Value.Position.Value.Z) ==
                      sup.create[0].position && new Vector3(desObj.Create(0).Value.LookDirection.Value.X,
                                                            desObj.Create(0).Value.LookDirection.Value.Y,
                                                            desObj.Create(0).Value.LookDirection.Value.Z) ==
                      sup.create[0].lookDirection;

            passed &= desObj.Update(0).Value.Id == sup.update[0].id && desObj.Update(0).Value.Owner == sup.update[0].owner &&
                      new Vector3(desObj.Update(0).Value.Position.Value.X, desObj.Update(0).Value.Position.Value.Y,
                                  desObj.Update(0).Value.Position.Value.Z) ==
                      sup.update[0].position && new Vector3(desObj.Update(0).Value.LookDirection.Value.X,
                                                            desObj.Update(0).Value.LookDirection.Value.Y,
                                                            desObj.Update(0).Value.LookDirection.Value.Z) ==
                      sup.update[0].lookDirection;


            return(passed);
        }
Пример #3
0
        /// <summary>
        /// Updates the local copy of the global state via server delta
        /// </summary>
        /// <param name="serverUpdate">changes to the global state since last server tick</param>
        private void UpdateLocalState(StateUpdate serverUpdate)
        {
            RoomStateGen newRoomState = new RoomStateGen(globalState);

            #region properties update

            bool propsChanged  = false;
            bool isSceneUpdate = false;
            if (!string.IsNullOrEmpty(serverUpdate.SiteDrive))
            {
                propsChanged  = true;
                isSceneUpdate = true;
            }
            else
            {
                if (serverUpdate.AnnotationsLength > 0)
                {
                    propsChanged = true;
                }
                if (serverUpdate.Poi.HasValue)
                {
                    propsChanged = true;
                }
            }
            if (propsChanged)
            {
                if (isSceneUpdate)
                {
                    if (OnPropertiesChanged != null)
                    {
                        OnPropertiesChanged.Invoke(this, serverUpdate);
                    }
                }
                else
                {
                    serverUpdate.Debounce(this, props =>
                    {
                        if (OnPropertiesChanged != null)
                        {
                            OnPropertiesChanged.Invoke(this, props);
                        }
                    }, isSceneUpdate);
                }
            }

            #endregion

            if (serverUpdate.DeleteLength > 0) //delete these object ids from the global state
            {
                print("Deleting " + serverUpdate.DeleteLength + " objects");
                for (int i = 0; i < serverUpdate.DeleteLength; i++)
                {
                    if (newRoomState.objects.All(tr => tr.id != serverUpdate.Delete(i)))
                    {
                        print("object to delete not found in global state " + serverUpdate.Delete(i));
                        continue;
                    }
                    newRoomState.objects.Remove(globalState.objects.Single(o => o.id == serverUpdate.Delete(i)));
                    if (trackers.ContainsKey(serverUpdate.Delete(i)) && trackers[serverUpdate.Delete(i)] != null)
                    {
                        Destroy(((MonoBehaviour)trackers[serverUpdate.Delete(i)]).gameObject);
                    }
                    else
                    {
                        print("Could not find game object to destroy" + serverUpdate.Delete(i));
                    }
                }
            }
            if (serverUpdate.CreateLength > 0) //create these objects and add them to the global state
            {
                for (int i = 0; i < serverUpdate.CreateLength; i++)
                {
                    if (!serverUpdate.Create(i).HasValue)
                    {
                        print("Malformed create message");
                        continue;
                    }
                    if (!trackers.ContainsKey(serverUpdate.Create(i).Value.Id))
                    {
                        CreateObject(serverUpdate.Create(i).Value, newRoomState);

                        //if (newRoomState.objects.Contains(serverUpdate.Create(i).Value))
                        //continue;
                    }
                    else
                    {
                        print("Object " + serverUpdate.Create(i).Value.Id + " already exists");
                    }
                    //else
                    //{
                    //  if (newRoomState.objects.Any(tr => tr.id == serverUpdate.Create(i).Value.Id))
                    //    newRoomState.objects.Remove(newRoomState.objects.Single(o => o.id == serverUpdate.Create(i).Value.Id));
                    //  var oldObj = (MonoBehaviour) trackers[serverUpdate.Create(i).Value.Id];
                    //  if (oldObj) Destroy(oldObj.gameObject);
                    //  trackers.Remove(serverUpdate.Create(i).Value.Id);
                    //}
                    //CreateObject(serverUpdate.Create(i).Value, newRoomState);
                }
            }
            if (serverUpdate.UpdateLength > 0)
            {
                for (int i = 0; i < serverUpdate.UpdateLength; i++)
                {
                    if (!serverUpdate.Update(i).HasValue)
                    {
                        continue;
                    }
                    if (!trackers.ContainsKey(serverUpdate.Update(i).Value.Id))
                    {
                        Debug.Log("Object created from update. please use the create function instead");
                        //CreateObject(serverUpdate.Update(i).Value, newRoomState);
                        continue;
                    }
                    trackers[serverUpdate.Update(i).Value.Id].UpdateFromRoomObject(serverUpdate.Update(i).Value);
                }
            }
            oldStateGen = new RoomStateGen(globalState);
            globalState = newRoomState;
        }
Пример #4
0
        /// <summary>
        /// Updates the local copy of the global state via server delta
        /// </summary>
        /// <param name="serverUpdate">changes to the global state since last server tick</param>
        private void UpdateLocalState(StateUpdate serverUpdate)
        {
            RoomStateGen newRoomState = new RoomStateGen(globalState);

            #region properties update

            bool propsChanged = false;
            if (propsChanged)
            {
            }

            #endregion

            if (serverUpdate.DeleteLength > 0) //delete these object ids from the global state
            {
                print("Deleting " + serverUpdate.DeleteLength + " objects");
                for (int i = 0; i < serverUpdate.DeleteLength; i++)
                {
                    if (newRoomState.objects.All(tr => tr.id != serverUpdate.Delete(i)))
                    {
                        print("object to delete not found in global state " + serverUpdate.Delete(i));
                        continue;
                    }
                    newRoomState.objects.Remove(globalState.objects.Single(o => o.id == serverUpdate.Delete(i)));
                    if (trackers.ContainsKey(serverUpdate.Delete(i)) && trackers[serverUpdate.Delete(i)] != null)
                    {
                        Destroy(((MonoBehaviour)trackers[serverUpdate.Delete(i)]).gameObject);
                    }
                    else
                    {
                        print("Could not find game object to destroy" + serverUpdate.Delete(i));
                    }
                }
            }
            if (serverUpdate.CreateLength > 0) //create these objects and add them to the global state
            {
                for (int i = 0; i < serverUpdate.CreateLength; i++)
                {
                    if (!serverUpdate.Create(i).HasValue)
                    {
                        print("Malformed create message");
                        continue;
                    }
                    if (!trackers.ContainsKey(serverUpdate.Create(i).Value.Id))
                    {
                        CreateObject(serverUpdate.Create(i).Value, newRoomState);

                        //if (newRoomState.objects.Contains(serverUpdate.Create(i).Value))
                        //continue;
                    }
                    else
                    {
                        print("Object " + serverUpdate.Create(i).Value.Id + " already exists");
                    }
                }
            }
            if (serverUpdate.UpdateLength > 0)
            {
                for (int i = 0; i < serverUpdate.UpdateLength; i++)
                {
                    if (!serverUpdate.Update(i).HasValue)
                    {
                        continue;
                    }
                    if (!trackers.ContainsKey(serverUpdate.Update(i).Value.Id))
                    {
                        Debug.Log("Object created from update. please use the create function instead");
                        //CreateObject(serverUpdate.Update(i).Value, newRoomState);
                        continue;
                    }
                    trackers[serverUpdate.Update(i).Value.Id].UpdateFromRoomObject(serverUpdate.Update(i).Value);
                }
            }
            oldStateGen = new RoomStateGen(globalState);
            globalState = newRoomState;
        }