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(); }
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); }
// @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); } } }
public void OnObjectSync(NetObject obj) { objectsToBeUpdated.Add(obj.ID); }