Exemplo n.º 1
0
        public NetEntity(int id, Engine engine, NetObjectManager nom) : base(id, engine)
        {
            DebugUtils.Assert(engine.GetType() == typeof(NetEngine), "Can't create a NetEntity without a net engine!");
            this.nom = nom;

            netObj = nom.CreateNetObject();
        }
Exemplo n.º 2
0
        private void RecursivelyRemoveNetObject(NetObject obj, bool childRemoval = false)
        {
            if (obj.HasChildren)
            {
                foreach (var child in obj.Children)
                {
                    RecursivelyRemoveNetObject(Get(child), true);
                }
                obj.Children.Clear();
            }
            if (obj.HasParent && !childRemoval)
            {
                Get(obj.ParentID).RemoveChild(obj.ID);
            }

            var packet = new NetDestroyPacket {
                NetID = obj.ID, DestroyData = obj.DestroyData
            };

            if (obj.SendToAllClients)
            {
                server.SendToAllClients(packet);
            }
            else
            {
                server.SendToSingleClient(packet, obj.ClientID);
            }

            obj.RemoveSyncListener(OnObjectSync);
            removedObjects.Add(obj.ID);
            obj.Alive = false;

            netObjects.Remove(obj.ID);
            netObjectPool.Recycle <NetObject>(obj);
        }
Exemplo n.º 3
0
        // @Note: Right now parent-child relationships have to be established BEFORE adding
        // the child to the NetObjectManager so when the packet is sent we can set the ParentID.
        public void AddNetObject(NetObject netObj)
        {
            // By using a queue we can traverse the hierarchy in a BFS order. This guarantees that
            // parents are created before children.
            var queue = new Queue <NetObject>();

            queue.Enqueue(netObj);

            while (queue.Count > 0)
            {
                var obj = queue.Dequeue();

                foreach (var childToAdd in obj.ChildrenToBeAdded)
                {
                    queue.Enqueue(childToAdd);
                }
                obj.ClearChildrenToBeAdded();

                DebugUtils.Assert(!netObjects.ContainsKey(obj.ID), $"NetObject with ID {obj.ID} already exists!");

                // Order matters when creating net objects. Children can't be added before their parents.
                DebugUtils.Assert(!obj.HasParent || netObjects.ContainsKey(obj.ParentID), $"NetObject[{obj.ID}]'s parent with id {obj.ParentID} hasn't been added yet! !");

                netObjects.Add(obj.ID, obj);
                obj.Added = true;
                //Debug.Log($"[Server] - Adding {obj.TypeName} net object {obj.ID} has parent {obj.HasParent}");

                DebugUtils.Assert(obj.NetObjectType != NetObjectType.NOTHING || obj.EntityType != EntityType.NOTHING, "Can't have NOTHING for both fields EntityType and NetObjectType");

                var packet = new NetCreatePacket {
                    NetID         = obj.ID,
                    NetObjectType = obj.NetObjectType,
                    EntityType    = obj.EntityType,
                    ParentID      = obj.HasParent ? obj.ParentID : -1,
                    CreateData    = obj.CreateData
                };

                if (obj.SendToAllClients)
                {
                    server.SendToAllClients(packet);
                }
                else
                {
                    server.SendToSingleClient(packet, obj.ClientID);
                }
            }
        }
Exemplo n.º 4
0
 public void OnObjectSync(NetObject obj)
 {
     objectsToBeUpdated.Add(obj.ID);
 }