// this is a little hacky as there aren't actually any entities to process // probably a sign that I'm abusing the entity component system. i think the proper // way to do this is to create a simple entity that just has a component to hold // a reference to the network agent. that's roughly how it would work in unity. // might be best to use a TagSystem like for player input? protected override void ProcessEntities(IDictionary<int, Entity> entities) { List<NetIncomingMessage> messages = _networkAgent.ReadMessages(); foreach(NetIncomingMessage netMessage in messages) { NetworkMessageType messageType = (NetworkMessageType)Enum.ToObject(typeof(NetworkMessageType), netMessage.ReadByte()); if(messageType == NetworkMessageType.PlayerConnect) { PlayerConnectMessage<UmbraEntityType> playerConnectMessage = new PlayerConnectMessage<UmbraEntityType>(); playerConnectMessage.Decode(netMessage); PlayerConnect(playerConnectMessage); } else if(messageType == NetworkMessageType.EntityAdd) { EntityAddMessage<UmbraEntityType> addMessage = new EntityAddMessage<UmbraEntityType>(); addMessage.Decode(netMessage); AddEntity(addMessage); } else if(messageType == NetworkMessageType.EntityMove) { EntityMoveMessage moveMessage = new EntityMoveMessage(); moveMessage.Decode(netMessage); MoveEntity(moveMessage); } else if(messageType == NetworkMessageType.EntityRemove) { EntityRemoveMessage removeMessage = new EntityRemoveMessage(); removeMessage.Decode(netMessage); RemoveEntity(removeMessage); } } }
private void RemoveEntity(EntityRemoveMessage msg) { Entity entity = CrawEntityManager.Instance.GetEntity(msg.EntityId); if(entity != null) entity.Delete(); }
private void OnPlayerDisconnect(NetConnection playerConnection) { long playerEntityId = _playerEntityIds[playerConnection]; Entity playerEntity = CrawEntityManager.Instance.GetEntity(playerEntityId); playerEntity.Delete(); _playerEntityIds.Remove(playerConnection); EntityRemoveMessage msg = new EntityRemoveMessage(playerEntityId); _networkAgent.BroadcastMessage(msg); }