public void Can_serialize_and_deserialize_entities() { var componentManager = new ComponentManager(); var entityManager = new EntityManager(componentManager); var entityFactory = new EntityFactory(); var serializer = new Serializer(); entityFactory.CreatePlayer(entityManager.Create(), new Vector2(200, 400), 1, PlayerIndex.One, default); entityFactory.CreatePlayer(entityManager.Create(), new Vector2(300, 400), 2, PlayerIndex.Two, default); var state = FullGameState.CreateFullGameState(componentManager, entityManager.Entities, 1, DateTime.UtcNow, DateTime.UtcNow.AddSeconds(1), 1); var writer = new NetDataWriter(); writer.Put(serializer.Serialize(state)); var bytes = writer.CopyData(); var reader = new NetDataReader(bytes); var target = serializer.Deserialize <FullGameState>(reader.GetRemainingBytes()); target.Components.Should() .BeEquivalentTo(state.Components, o => o .Excluding(c => c.Path.EndsWith(nameof(CollisionBody.OldPosition)) || c.Path.EndsWith(nameof(PlayerState.LocalPlayerIndex)) || c.Path.EndsWith(nameof(PlayerState.IsLocal)) ) ); }
private void SendWorldData(NetPeer peer) { var utcNow = DateTime.UtcNow; var resumeIn = TimeSpan.FromSeconds(1); var resumeAtUtc = utcNow.Add(resumeIn); sharedContext.ResumeAtGameTime = gameTime.TotalGameTime + resumeIn; Console.WriteLine("Sending initial world data"); var state = FullGameState.CreateFullGameState(componentMapperService, ActiveEntities, sharedContext.FrameCounter, utcNow, resumeAtUtc, peer.Id); var bytes = serializer.Serialize(state); var writer = new NetDataWriter(); writer.Put(NetMessageType.FullGameState, bytes); peer.Send(writer, DeliveryMethod.ReliableOrdered); statusByPeer[peer] = PeerStatus.WorldDataSent; }