private void OnReadyToPlayAll(Error error, Player[] players, Guid[] localPlayers, VoxelAbilitiesArray[] abilities, SerializedTaskArray[] taskTemplates, SerializedTaskTemplatesArray[] TaskTemplateData, AssignmentGroupArray[] assignmentGroups, Room room)
        {
            if (m_matchServer.HasError(error))
            {
                Error(error);
                m_matchServer.Disconnect();
                return;
            }

            //if(m_rttInfo.RTT < GameConstants.MatchEngineTick)
            //{
            //    //In case of low rtt we offset client timer by one tick to the past
            //    m_prevTickTime += GameConstants.MatchEngineTick;
            //}


            long maxPing = GameConstants.PingTimeout;

            if (m_rttInfo.RTTMax > maxPing)
            {
                Debug.LogWarningFormat("Ping is too high {0} ms", m_rttInfo.RTTMax * GameConstants.MatchEngineTick);
                //set max ping to RTT_MAX?
            }
            m_nextTickTime = Time.realtimeSinceStartup + Math.Max(0, (maxPing - m_rttInfo.RTTMax) / 4) * GameConstants.MatchEngineTick;

            m_cmdQueue      = new CommandsQueue(maxPing);
            m_isInitialized = true;

            m_taskEngines = new ITaskEngine[players.Length];
            m_pathFinders = new IPathFinder[players.Length];
            m_taskRunners = new ITaskRunner[players.Length];

            for (int i = 0; i < players.Length; ++i)
            {
                Player player = players[i];

                if (player.IsBot || localPlayers.Contains(players[i].Id))
                {
                    ITaskRunner taskRunner = MatchFactoryCli.CreateTaskRunner();
                    m_taskRunners[i] = taskRunner;
                    IPathFinder pathFinder = MatchFactoryCli.CreatePathFinder(m_map.Map);
                    m_pathFinders[i] = pathFinder;

                    ITaskEngine taskEngine = MatchFactoryCli.CreateTaskEngine(m_game, taskRunner, pathFinder);
                    taskEngine.ClientRequest += ProcessClientRequest;
                    m_taskEngines[i]          = taskEngine;
                }
            }

            if (Started != null)
            {
                Started(new Error(StatusCode.OK), players, localPlayers, abilities, taskTemplates, TaskTemplateData, assignmentGroups, room);
            }

            enabled = true; //update method will be called
        }