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))
                                   )
                        );
    }
Example #2
0
    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;
    }