public void TestSerialzation()
        {
            //Clientside create command, send to server
            var writer = new LiteNetLibSerializer();

            new TestCommand();

            //Serverside, gather input
            var writer2 = new LiteNetLibSerializer();
            var packer  = new InputPacker();

            packer.AddInput(writer.Data);
            packer.Pack(writer2);

            //Clientside, receive input
            var reader = new LiteNetLibDeserializer();

            reader.SetSource(writer2.Data);

            var messageTag = reader.GetByte();

            messageTag.ShouldBe((byte)MessageTag.Frame);

            var commands = new InputParser(r => new TestCommand()).DeserializeInput(reader);

            commands.ShouldNotBeNull();
            commands.Length.ShouldBe(1);
            commands.First().ShouldBeOfType <TestCommand>();
        }
Beispiel #2
0
        public void Open(int roomSize)
        {
            _listener.ConnectionRequestEvent += request =>
            {
                if (_server.PeersCount < roomSize)
                {
                    request.AcceptIfKey(ClientKey);
                }
                else
                {
                    request.Reject();
                }
            };

            _listener.PeerConnectedEvent += peer =>
            {
                if (_server.PeersCount == roomSize)
                {
                    Console.WriteLine("Room is full, starting new simulation...");
                    new Thread(Loop)
                    {
                        IsBackground = true
                    }.Start();
                }
                else
                {
                    Console.WriteLine(_server.PeersCount + " / " + roomSize + " players have connected.");
                }
            };

            _listener.NetworkReceiveEvent += (peer, reader, method) =>
            {
                var messageTag = (MessageTag)reader.GetByte();
                switch (messageTag)
                {
                case MessageTag.Input:
                    _inputPacker?.AddInput(reader.GetRemainingBytes());
                    break;

                case MessageTag.Checksum:
                    _deserializer.SetSource(reader.GetRemainingBytes());

                    var pkt = new HashCode();
                    pkt.Deserialize(_deserializer);
                    if (!_hashCodes.ContainsKey(pkt.FrameNumber))
                    {
                        _hashCodes[pkt.FrameNumber] = pkt.Value;
                    }
                    else
                    {
                        Console.WriteLine((_hashCodes[pkt.FrameNumber] == pkt.Value ? "HashCode valid" : "Desync") + ": " + pkt.Value);
                    }
                    break;
                }
            };

            _listener.PeerDisconnectedEvent += (peer, info) =>
            {
                if (_server.ConnectedPeerList.Count == 0)
                {
                    Console.WriteLine("All players left, stopping current simulation...");
                    Running = false;
                }
                else
                {
                    Console.WriteLine(_server.PeersCount + " players remaining.");
                }
            };

            _server.Start(ServerPort);

            Console.WriteLine("Server started. Waiting for " + roomSize + " players...");
        }