コード例 #1
0
    public ITask StartCoroutine(IEnumerator <IYieldInstruction> task)
    {
        if (task == null)
        {
            throw new ArgumentNullException("task");
        }

        ITask result;

        // IEnumerators start 'before the first location', so calling this once here gets the task ready to execute
        if (task.MoveNext())
        {
            SchedulerTask schedulerTask = new SchedulerTask(this, task);
            result = schedulerTask;
            if (task.Current is IFixedYieldInstruction)
            {
                mPendingFixedUpdateTasks.Add(schedulerTask);
            }
            else
            {
                mPendingTasks.Add(schedulerTask);
            }
        }
        else
        {
            // This coroutine never yielded, so it's execution is complete
            result = new EmptyTask();
        }

        return(result);
    }
コード例 #2
0
        public override BaseFlowNode Build()
        {
            var result = new EmptyTask();

            FeedActivityNode(result);
            return(result);
        }
コード例 #3
0
        public override object Clone()
        {
            var result = new EmptyTask();

            FeedActivity(result);
            return(result);
        }
コード例 #4
0
        public async Task LotsOfClientsGoToGameServer()
        {
            for (var i = 0; i < 3; i++)
            {
                await TestBody(i + 1, CLIENT_CONNECTS_TO_IP, SERVER_PORT_MM, new Dictionary <byte, object>
                {
                    { FakePropertyCodes.PlayerProperties.Level, 1 }
                }, new Dictionary <byte, object>());

                EmptyTask.Wait(3000);
            }
        }
コード例 #5
0
        public void ClientConnectTest()
        {
            _client.Connect(CLIENT_CONNECTS_TO_IP, SERVER_PORT);
            EmptyTask.Wait(WAIT_TIMEOUT);

            Assert.AreEqual(1, _gameApplication.GetStats().PeerCount);
            _client.Disconnect();
            EmptyTask.Wait(WAIT_TIMEOUT);

            Assert.AreEqual(0, _gameApplication.GetStats().PeerCount);
            _client.Connect(CLIENT_CONNECTS_TO_IP, SERVER_PORT);
            EmptyTask.Wait(WAIT_TIMEOUT);

            Assert.AreEqual(1, _gameApplication.GetStats().PeerCount);

            _client.Disconnect();
            EmptyTask.Wait(WAIT_TIMEOUT);
        }
コード例 #6
0
        public async Task SecondJoinToSameRoom()
        {
            RegisterServer();

            //clients connect
            _client1.Connect(CLIENT_CONNECTS_TO_IP, MM_SERVER_PORT);
            _client2.Connect(CLIENT_CONNECTS_TO_IP, MM_SERVER_PORT);
            _client3.Connect(CLIENT_CONNECTS_TO_IP, MM_SERVER_PORT);

            EmptyTask.Wait(WAIT_TIMEOUT);


            EmptyTask.Wait(WAIT_TIMEOUT);
            //first creates room
            await _client1.Send <EnterMatchMakingResponse>(new EnterMatchMakingRequest(new Dictionary <byte, object> {
                { FakePropertyCodes.PlayerProperties.Level, 3 }
            }));

            //wait for adding bots and creating room
            EmptyTask.Wait(100);
            //second should go to the same room
            await _client2.Send <EnterMatchMakingResponse>(new EnterMatchMakingRequest(new Dictionary <byte, object> {
                { FakePropertyCodes.PlayerProperties.Level, 3 }
            }));

            await _client1.WaitFor <JoinInfoEvent>(e => e.JoinInfo != null && e.JoinInfo.Status == JoinStatus.RoomIsReady);

            await _client2.WaitFor <JoinInfoEvent>(e => e.JoinInfo != null && e.JoinInfo.Status == JoinStatus.RoomIsReady);

            //check room number
            var stats = _mmApplication.GetStats();

            Assert.AreEqual(1, stats.CreatedRoomsCount);

            //third join after room closed
            await _client3.Send <EnterMatchMakingResponse>(new EnterMatchMakingRequest(new Dictionary <byte, object> {
                { FakePropertyCodes.PlayerProperties.Level, 3 }
            }));

            await _client3.WaitFor <JoinInfoEvent>(e => e.JoinInfo != null && e.JoinInfo.Status == JoinStatus.RoomIsReady, 11000);

            stats = _mmApplication.GetStats();
            Assert.AreEqual(2, stats.CreatedRoomsCount);
        }
コード例 #7
0
        public void PassProperties()
        {
            var roomId = _gameApplication.CreateRoom(
                new Dictionary <byte, object>()
            {
                { PropertyCode.RoomProperties.GameMode, (byte)GameMode.SinglePlayer }
            },
                new Dictionary <Guid, Dictionary <byte, object> >());

            _client.Connect(CLIENT_CONNECTS_TO_IP, SERVER_PORT);
            EmptyTask.Wait(WAIT_TIMEOUT);

            //authing
            EmptyTask.Wait(WAIT_TIMEOUT);

            //send join
            var props = new Dictionary <byte, object>
            {
                { 1, 100 },
                { 2, (byte)101 },
                { 3, (short)102 },
                { 4, (ushort)103 },
                { 5, (uint)104 },
                { 6, (float)105.15 },
                { 7, true },
                { 8, (long)106 },
                { 9, (ulong)110 },
                { 10, new byte[] { 111, 112, 113 } }
            };

            _client.Send <JoinRoomResponse>(new JoinRoomRequest(roomId, props));

            EmptyTask.Wait(WAIT_TIMEOUT);


            var peer       = _gameApplication.GetListeners()[0].GetPeerCollection().GetAll().FirstOrDefault().Value;
            var room       = _gameApplication.GetRoomManager().GetRoomBySessionId(peer.GetSessionId());
            var roomPlayer = room.FindPlayer(peer.GetSessionId());

            Assert.AreEqual(props, roomPlayer.Properties);
        }
コード例 #8
0
        public async Task JoinMaxPlusOne()
        {
            RegisterServer();

            //clients connect
            _client1.Connect(CLIENT_CONNECTS_TO_IP, MM_SERVER_PORT);
            _client2.Connect(CLIENT_CONNECTS_TO_IP, MM_SERVER_PORT);
            _client3.Connect(CLIENT_CONNECTS_TO_IP, MM_SERVER_PORT);

            EmptyTask.Wait(WAIT_TIMEOUT);

            await _client1.Send <EnterMatchMakingResponse>(new EnterMatchMakingRequest(new Dictionary <byte, object> {
                { FakePropertyCodes.PlayerProperties.Level, 3 }
            }));

            await _client2.Send <EnterMatchMakingResponse>(new EnterMatchMakingRequest(new Dictionary <byte, object> {
                { FakePropertyCodes.PlayerProperties.Level, 3 }
            }));

            await _client3.Send <EnterMatchMakingResponse>(new EnterMatchMakingRequest(new Dictionary <byte, object> {
                { FakePropertyCodes.PlayerProperties.Level, 3 }
            }));

            //wait for creating room
            EmptyTask.Wait(1000);

            await _client1.WaitFor <JoinInfoEvent>(e => e.JoinInfo != null && e.JoinInfo.Status == JoinStatus.RoomIsReady);

            await _client2.WaitFor <JoinInfoEvent>(e => e.JoinInfo != null && e.JoinInfo.Status == JoinStatus.RoomIsReady);

            await _client3.WaitFor <JoinInfoEvent>(e => e.JoinInfo != null && e.JoinInfo.Status == JoinStatus.RoomIsReady);

            //check room number
            var stats = _mmApplication.GetStats();

            Assert.AreEqual(2, stats.CreatedRoomsCount);
        }
コード例 #9
0
        public void IntegrationTest()
        {
            var isSuccess = false;

            //create 12 clients and connect them to mm
            for (var i = 0; i < CLIENTS_NUMBER_1; i++)
            {
                var client = new TestClientPeer(_clientLogger, taskSchedulerFactory, serializer);
                client.Connect(CLIENT_CONNECTS_TO_IP, SERVER_PORT_MM);
                _clients.Add(client);
                EmptyTask.Wait(WAIT_TIMEOUT);
            }

            //send auth
            _clients.ForEach(c => c.Send <AuthorizationResponse>(new AuthorizationRequest()).Wait());

            //send join matchmaking (with level = 1)
            _clients.ForEach(c => c.Send <EnterMatchMakingResponse>(new EnterMatchMakingRequest(new Dictionary <byte, object> {
                { FakePropertyCodes.PlayerProperties.Level, 1 }
            })).Wait());
            _clients.ForEach(c => c.WaitFor <JoinInfoEvent>(e => e.JoinInfo != null && e.JoinInfo.Status == JoinStatus.RoomIsReady));

            var mmStats = _mmApplication.GetStats();

            Assert.AreEqual(1, mmStats.RegisteredServers.Count);

            //sending leave mathmaking request
            _clients.ForEach(c => c.Send <LeaveMatchMakingResponse>(new LeaveMatchMakingRequest()).Wait());
            _clients.ForEach(c => c.Disconnect());

            mmStats = _mmApplication.GetStats();
            Assert.AreEqual(0, mmStats.TotalPlayers);
            Assert.AreEqual(1, mmStats.RegisteredServers.Count);

            //connect to server
            _clients.ForEach(c => c.Connect(c.GetJoinInfo().ServerIpAddress.ToString(), c.GetJoinInfo().ServerPort));
            var roomId = _clients.First().GetJoinInfo().RoomId;

            EmptyTask.Wait(MM_TICK * 2);
            var stats = _gameApplication.GetStats();

            Assert.AreEqual(CLIENTS_NUMBER_1, stats.PeerCount);
            Assert.AreEqual(1, stats.RoomCount);
            var roomsPeerCount = stats.RoomsPeerCount.First();

            //players did not join room yet
            Assert.AreEqual(roomId, roomsPeerCount.Key);
            Assert.AreEqual(0, roomsPeerCount.Value);

            //authing
            _clients.ForEach(c =>
            {
                var sessionId = Guid.NewGuid();
                c.SessionId   = sessionId;
                c.Send <AuthorizationResponse>(new AuthorizationRequest()
                {
                    SessionId = sessionId
                });
            });
            EmptyTask.Wait(WAIT_TIMEOUT);

            //joining room
            _clients.ForEach(c => c.Send <JoinRoomResponse>(new JoinRoomRequest(roomId, new Dictionary <byte, object>())));
            EmptyTask.Wait(WAIT_TIMEOUT);
            stats          = _gameApplication.GetStats();
            roomsPeerCount = stats.RoomsPeerCount.First();

            //players joined room
            Assert.AreEqual(roomId, roomsPeerCount.Key);
            Assert.AreEqual(CLIENTS_NUMBER_1, roomsPeerCount.Value);

            //activity
            //each client sends 1000 events to others
            _clients.ForEach(c =>
            {
                for (int i = 0; i < EVENTS_SENT; i++)
                {
                    c.SendEvent(new TestRoomEvent(true, 122, 4.668f, new List <int>()));
                }
            });

            EmptyTask.Wait(WAIT_TIMEOUT * 100);

            isSuccess = true;
            _clients.ForEach(c =>
            {
                if (c.CountOf <TestRoomEvent>() != (CLIENTS_NUMBER_1 - 1) * EVENTS_SENT)
                {
                    _clientLogger.Error($"test events {c.CountOf<TestRoomEvent>()}/{(CLIENTS_NUMBER_1 - 1) * EVENTS_SENT}");
                    isSuccess = false;
                }
            });
            Assert.IsTrue(isSuccess);

            //disconnect from server
            _clients.ForEach(c => c.Disconnect());
            EmptyTask.Wait(WAIT_TIMEOUT);
            stats = _gameApplication.GetStats();
            Assert.AreEqual(0, stats.PeerCount);
        }
コード例 #10
0
        private async Task TestBody(int launchIndex, string ip, ushort port, Dictionary <byte, object> mmProperties, Dictionary <byte, object> joinGameProperties)
        {
            var isSuccess = false;

            _clients.Clear();
            //create N clients and connect them to mm
            for (var i = 0; i < CLIENTS_NUMBER_2; i++)
            {
                var client = new TestClientPeer(_clientLogger, taskSchedulerFactory, serializer);
                await client.Connect(ip, port);

                _clients.Add(client);
                EmptyTask.Wait(WAIT_TIMEOUT);
            }

            //send auth
            foreach (var client in _clients)
            {
                await client.Send <AuthorizationResponse>(new AuthorizationRequest());
            }

            //send join matchmaking (with level = 1)
            foreach (var c in _clients)
            {
                await c.Send <EnterMatchMakingResponse>(new EnterMatchMakingRequest(mmProperties));
            }

            EmptyTask.Wait(6000);

            //check joininfo existance
            isSuccess = true;
            int notJoinedCount = 0;
            int joinedCount    = 0;

            foreach (var c in _clients)
            {
                if (c.GetJoinInfo() == null || c.GetJoinInfo().Status != JoinStatus.RoomIsReady)
                {
                    if (c.GetJoinInfo() != null)
                    {
                        _clientLogger.Info($"Checking joinInfo. Status = {c.GetJoinInfo().Status}");
                    }
                    notJoinedCount++;
                    isSuccess = false;
                }
                else
                {
                    if (c.GetJoinInfo() != null)
                    {
                        _clientLogger.Info($"Checking joinInfo. Status = {c.GetJoinInfo().Status}");
                    }
                    joinedCount++;
                }
            }

            Assert.AreEqual(0, notJoinedCount);
            var roomsCount = CLIENTS_NUMBER_2 / TOTAL_PLAYERS_NEEDED_1 + (CLIENTS_NUMBER_2 % TOTAL_PLAYERS_NEEDED_1 > 0 ? 1: 0);

            Assert.AreEqual(CLIENTS_NUMBER_2 - joinedCount, notJoinedCount);

            var mmStats = _mmApplication.GetStats();

            Assert.AreEqual(1, mmStats.RegisteredServers.Count);

            //sending leave mathmaking request
            foreach (var c in _clients)
            {
                await c.Send <LeaveMatchMakingResponse>(new LeaveMatchMakingRequest());
            }
            foreach (var c in _clients)
            {
                c.Disconnect();
            }

            mmStats = _mmApplication.GetStats();
            Assert.AreEqual(0, mmStats.TotalPlayers);
            Assert.AreEqual(1, mmStats.RegisteredServers.Count);


            //connect to server
            foreach (var c in _clients.Where(c =>
                                             c.GetJoinInfo() != null && c.GetJoinInfo().Status == JoinStatus.RoomIsReady))
            {
                await c.Connect(c.GetJoinInfo().ServerIpAddress, c.GetJoinInfo().ServerPort);
            }

            var stats = _gameApplication.GetStats();

            Assert.AreEqual(joinedCount, stats.PeerCount);
            Assert.AreEqual(roomsCount * launchIndex, stats.RoomCount);

            //authing
            foreach (var c in _clients)
            {
                var sessionId = Guid.NewGuid();
                c.SessionId = sessionId;
                await c.Send <AuthorizationResponse>(new AuthorizationRequest { SessionId = sessionId });
            }

            EmptyTask.Wait(WAIT_TIMEOUT);

            //joining room
            foreach (var c in _clients.Where(c => c.GetJoinInfo() != null))
            {
                await c.Send <JoinRoomResponse>(new JoinRoomRequest(c.GetJoinInfo().RoomId, joinGameProperties));
            }
            EmptyTask.Wait(WAIT_TIMEOUT * 2);
            stats = _gameApplication.GetStats();
            Assert.AreEqual(roomsCount * launchIndex, stats.RoomCount);
            Assert.AreEqual(stats.RoomsPeerCount.Count, stats.RoomCount);

            //disconnect from server
            foreach (var c in _clients)
            {
                c.Disconnect();
            }

            EmptyTask.Wait(WAIT_TIMEOUT);
            stats = _gameApplication.GetStats();
            Assert.AreEqual(0, stats.PeerCount);
        }