Ejemplo n.º 1
0
        private void OnEngineCommands(Error error, long clientTick, CommandsBundle commandBundle)
        {
            if (m_engine.HasError(error))
            {
                if (error.Code != StatusCode.Outdated)
                {
                    m_notification.ShowError(error);
                    return;
                }
            }

            long serverTick = commandBundle.Tick;

            CommandsArray[] playersCommands = commandBundle.Commands;
            //List<TaskStateInfo> taskStateInfo = commandBundle.TasksStateInfo;
            bool isGameCompleted = commandBundle.IsGameCompleted;

            m_minimap.BeginUpdate();

            List <IMatchPlayerControllerCli> defeatedPlayers = null;

            for (int p = 0; p < playersCommands.Length; ++p)
            {
                CommandsArray commands = playersCommands[p];
                if (commands.Commands == null)
                {
                    continue;
                }

                if (error.Code == StatusCode.Outdated)
                {
                    Debug.LogWarning("Executing outdated command a little bit faster " + serverTick);
                }

                IMatchPlayerControllerCli playerController = m_playerControllers[p];
                long lagTicks = clientTick - serverTick;
                Debug.Assert(lagTicks >= 0);

                playerController.Execute(commands.Commands, clientTick, lagTicks);

                PlayerStats stats = m_playerStats[p];
                if (stats.IsInRoom && !playerController.IsInRoom)
                {
                    stats.IsInRoom = false;
                    //Raise player deactivated event;
                    Debug.Log("Player " + m_players[p].Name + " has left the game");

                    if (defeatedPlayers == null)
                    {
                        defeatedPlayers = new List <IMatchPlayerControllerCli>();
                    }
                    defeatedPlayers.Add(playerController);
                }
                else if (playerController.ControllableUnitsCount == 0)
                {
                    if (defeatedPlayers == null)
                    {
                        defeatedPlayers = new List <IMatchPlayerControllerCli>();
                    }
                    defeatedPlayers.Add(playerController);
                }

                stats.ControllableUnitsCount = playerController.ControllableUnitsCount;
            }

            if (defeatedPlayers != null)
            {
                for (int i = 0; i < defeatedPlayers.Count; ++i)
                {
                    IMatchPlayerControllerCli defeatedPlayer = defeatedPlayers[i];
//#warning Temporary disabled due to strange bugs
                    defeatedPlayer.DestroyAllUnitsAndAssets();

                    if (PlayerDefeated != null)
                    {
                        PlayerDefeated(defeatedPlayer.Index);
                    }
                }
            }

            if (!m_gSettings.DisableFogOfWar)
            {
                m_minimap.EndUpdate();
            }


            IsCompleted = isGameCompleted;
        }