예제 #1
0
        public void CompleteInitialization(NetworkObject networkObject)
        {
            lock (NetworkObjects)
            {
                NetworkObjects.Add(networkObject.NetworkId, networkObject);
                NetworkObjectList.Add(networkObject);
            }

            List <Action <NetworkObject> > actions = null;

            lock (missingObjectBuffer)
            {
                missingObjectBuffer.TryGetValue(networkObject.NetworkId, out actions);
                missingObjectBuffer.Remove(networkObject.NetworkId);
            }

            if (actions == null)
            {
                return;
            }

            foreach (var action in actions)
            {
                action(networkObject);
            }
        }
        /// <summary>
        /// Creates a frame for a specific transmitter and list
        /// </summary>
        /// <param name="transmitter"></param>
        /// <param name="objectList"></param>
        /// <returns></returns>
        private Frame CreateFrame(NetworkFrameListTransmitter transmitter, NetworkObjectList objectList)
        {
            var previousFrame = transmitter.CurrentList?.FindFrameByListId(objectList.Id);

            var frame = new Frame(objectList.Id);

            transmitter.Listener.OnBeginProcessList(objectList);

            foreach (var networkObject in objectList.InternalNetworkObjects)
            {
                if (networkObject.Destroyed)
                {
                    frame.CreateObjectDestruction(networkObject.Handle.Id);

                    //Don't remove a destroyed object's data from previous frames, we may need to reconstruct it for lag compensation
                }
                else
                {
                    if (transmitter.Listener.FilterNetworkObject(objectList, networkObject))
                    {
                        frame.CreateUpdate(networkObject, previousFrame);
                    }
                }
            }

            transmitter.Listener.OnEndProcessList(objectList);

            return(frame);
        }
예제 #3
0
 public void CompleteInitialization(NetworkObject networkObject)
 {
     lock (NetworkObjects)
     {
         if (!NetworkObjects.ContainsKey(networkObject.NetworkId))
         {
             NetworkObjects.Add(networkObject.NetworkId, networkObject);
             NetworkObjectList.Add(networkObject);
         }
     }
 }
예제 #4
0
        /// <summary>
        /// Used to manually remove a networkobject from the networker
        /// </summary>
        /// <param name="networkObject"></param>
        public void ManualRemove(NetworkObject networkObject)
        {
            lock (NetworkObjects)
            {
                NetworkObjects.Remove(networkObject.NetworkId);
            }

            lock (NetworkObjectList)
            {
                NetworkObjectList.Remove(networkObject);
            }
        }
예제 #5
0
        public void NetworkObjectListWorksProperly2()
        {
            GameObject go_a = new GameObject();
            GameObject go_b = new GameObject();
            GameObject go_c = new GameObject();

            NetworkObjectList list = new NetworkObjectList();

            Assert.True(list.IsVacant(0));
            list[0] = go_a;
            Assert.False(list.IsVacant(0));
            Assert.AreSame(go_a, list[0]);

            GameObject go_d = list.RemoveAt(0);

            Assert.AreSame(go_a, go_d);
            Assert.True(list.IsVacant(0));
        }
예제 #6
0
        /// <summary>
        /// Used to manually remove a bunch of networkobjects from the networker
        /// </summary>
        /// <param name="networkObjects"></param>
        public void ManualRemove(List <NetworkObject> networkObjects)
        {
            foreach (NetworkObject obj in networkObjects)
            {
                lock (NetworkObjects)
                {
                    NetworkObjects.Remove(obj.NetworkId);
                }
            }

            foreach (NetworkObject obj in networkObjects)
            {
                lock (NetworkObjectList)
                {
                    NetworkObjectList.Remove(obj);
                }
            }
        }
        /// <summary>
        /// Creates a new list with the given name
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public INetworkObjectList CreateList(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("Network object list name should contain at least one valid character", nameof(name));
            }

            if (FindListByName(name) != null)
            {
                throw new ArgumentException($"A list with name \"{name}\" already exists", nameof(name));
            }

            var objectList = new NetworkObjectList(this, name, _objectLists.Count);

            _objectLists.Add(objectList);

            return(objectList);
        }
예제 #8
0
        public FrameMessage Serialize(NetworkObjectList objectList, Frame previousFrame)
        {
            var updateList = new List <MemoryStream>();

            foreach (var update in _updates)
            {
                var data = update.Serialize(objectList.InternalGetNetworkObjectById(update.ObjectHandle.Id), previousFrame?.FindUpdateByObjectId(update.ObjectHandle.Id));

                //TODO: figure out if there's a better way to handle change detection during serialization
                //if (data.ContainsChanges)
                {
                    data.Memory.Position = 0;
                    updateList.Add(data.Memory);
                }
            }

            var stream = new MemoryStream();

            using (var codedStream = new CodedOutputStream(stream, true))
            {
                codedStream.WriteInt32(updateList.Count);

                foreach (var update in updateList)
                {
                    codedStream.WriteBytes(ByteString.FromStream(update));
                    update.Dispose();
                }
            }

            stream.Position = 0;

            var frameMessage = new FrameMessage
            {
                ListId = (uint)ListId,

                ObjectUpdates = ByteString.FromStream(stream)
            };

            stream.Dispose();

            frameMessage.ObjectsDestroyed.AddRange(_destroyedObjects);

            return(frameMessage);
        }
예제 #9
0
        public void NetworkObjectListWorksProperly()
        {
            NetworkObjectList list = new NetworkObjectList();

            GameObject go_a = new GameObject();
            GameObject go_b = new GameObject();
            GameObject go_c = new GameObject();
            GameObject go_d = new GameObject();

            list[0] = go_a;
            Assert.AreSame(go_a, list[0]);
            list[1] = go_b;
            Assert.AreSame(go_b, list[1]);
            list[2] = go_c;
            Assert.AreSame(go_b, list[1]);
            Assert.AreSame(go_b, list.RemoveAt(1));
            Assert.Null(list[1]);
            Assert.Null(list.RemoveAt(1));
            Assert.NotNull(list[2]);
            list[1] = go_d;
            Assert.NotNull(list[2]);
            Assert.AreSame(go_c, list[2]);
            Assert.AreSame(go_c, list.RemoveAt(2));
        }
        /// <summary>
        /// Register a networked object with this networker
        /// </summary>
        /// <param name="networkObject">The object that is to be registered with this networker</param>
        /// <returns><c>true</c> if the object was registered successfully, else <c>false</c> if it has already been registered</returns>
        public bool RegisterNetworkObject(NetworkObject networkObject, uint forceId = 0)
        {
            uint id = currentNetworkObjectId;

            lock (NetworkObjects)
            {
                // If we are forcing this object
                if (forceId != 0)
                {
                    if (NetworkObjects.ContainsKey(forceId))
                    {
                        return(false);
                    }

                    id = forceId;

                    if (!networkObject.RegisterOnce(id))
                    {
                        throw new BaseNetworkException("The supplied network object has already been assigned to a networker and has an id");
                    }

                    //AddNetworkObject(forceId, networkObject);
                    //NetworkObjectList.Add(networkObject);
                }
                else
                {
                    do
                    {
                        if (NetworkObjects.ContainsKey(++currentNetworkObjectId))
                        {
                            continue;
                        }

                        if (!networkObject.RegisterOnce(currentNetworkObjectId))
                        {
                            // Backtrack since the next call to this method will increment before checking
                            currentNetworkObjectId--;

                            throw new BaseNetworkException("The supplied network object has already been assigned to a networker and has an id");
                        }

                        //AddNetworkObject(currentNetworkObjectId, networkObject);
                        //NetworkObjectList.Add(networkObject);
                        break;
                    } while (IsBound);
                }
            }

            // Assign the network id to the network object
            networkObject.RegisterOnce(id);

            // When this object is destroyed it needs to remove itself from the list
            networkObject.onDestroy += (NetWorker sender) =>
            {
                lock (NetworkObjects)
                {
                    NetworkObjects.Remove(networkObject.NetworkId);
                    NetworkObjectList.Remove(networkObject);
                }
            };

            return(true);
        }
예제 #11
0
 private NetworkObject CreateNetworkObject(NetworkObjectList objectList, TypeMetaData metaData, in ObjectHandle objectHandle)