Индекс находился вне границ массива.в CSGO_Server_Manager.CfrmMain. <GetConnectedData>d__39.MoveNext () - PullRequest
0 голосов
/ 10 июля 2019

Я создал диспетчер сервера CSGO и получаю сообщение об ошибке: «System.IndexOutOfRangeException: индекс находился за пределами массива».

Я использовал try / catch для всего метода, но этопо-прежнему заканчивается ошибкой во время выполнения.Я использовал блокировку для асинхронного метода.

//Calling the method
try
{
          GetConnectedData(newData.Split(new string[] { "\n", "\r" },
          StringSplitOptions.RemoveEmptyEntries));
}
catch (Exception ex)
{
          //Writing some error data to file
}


//The GetConnectedData Method (It's not pretty, but it's what I have to work with)
private async void GetConnectedData(string[] data)
{
    while (connectedDataLock)
        await Task.Delay(100);

    connectedDataLock = true;

    bool clientChange = false;

    for (int i = 0; i < data.Length; i++)
    {
        if (!currentConnectedFirst)
        {
            if (data[i].StartsWith("Client \"") && data[i].Contains("connected"))
            {
                clientChange = true;
            }
            else if (data[i].StartsWith("Dropped ") && data[i].Contains("from server"))
            {
                clientChange = true;
            }
            else if (data[i] == "Server is hibernating")
            {
                clientChange = false;

                foreach (Player player in players)
                    Tool.Log("Player \"" + player.Name + "\" disconnected from the server");

                currentConnected.Clear();
                players.Clear();
            }
            else if (data[i] == "# userid name uniqueid connected ping loss state rate adr")
            {
                try
                {
                    //pendingPlayerUpdate = false;

                    int j = i + 1;

                    while (data[j] != "#end")
                        j++;

                    List<string> currentConnectedNew = new List<string>();
                    players.Clear();

                    for (int k = i + 1; k < j; k++)
                    {
                        string[] playerData = data[k].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

                        if (playerData.Length >= 10)
                        {
                            if (playerData.Length > 10)
                            {
                                List<int> locations = new List<int>();

                                for (int d = 0; d < playerData.Length; d++)
                                {
                                    if (playerData[d].StartsWith("\""))
                                        locations.Add(d);
                                    if (playerData[d].EndsWith("\""))
                                        locations.Add(d);
                                }

                                int begin = locations[0];
                                int last = locations[1];

                                List<string> newPlayerData = new List<string>();
                                newPlayerData.AddRange(playerData.Take(begin));

                                string name = "";
                                for (int l = begin; l <= last; l++)
                                    name += playerData[l] + " ";

                                newPlayerData.Add(name.Substring(0, name.Length - 1));
                                newPlayerData.AddRange(playerData.Skip(last + 1));

                                playerData = newPlayerData.ToArray();
                            }

                            Player player = new Player()
                            {
                                Name = playerData[3].Substring(1, playerData[3].Length - 2),
                                SteamId = playerData[4]
                            };

                            if (players.Where(p => p.SteamId == player.SteamId).Count() == 0)
                            {
                                uniquePlayers.Add(player);
                                players.Add(player);

                                uniquePlayers = uniquePlayers.GroupBy(p => new { p.SteamId })
                                                             .Select(p => p.Last())
                                                             .ToList();

                                currentConnectedNew.Add(player.Name);
                                if (!uniqueConnections.Contains(player.Name))
                                    uniqueConnections.Add(player.Name);
                            }
                        }
                    }

                    for (int m = 0; m < currentConnectedNew.Count; m++)
                    {
                        if (currentConnected.IndexOf(currentConnectedNew[m]) == -1) //Connected
                        {
                            currentConnected.Add(players[m].Name);
                            Tool.Log("Player \"" + players[m].Name + "\" connected to the server (" + players[m].SteamId + ")");
                        }
                    }

                    List<string> left = currentConnected.Except(currentConnectedNew).ToList(); //Might be an error **************************

                    for (int m = 0; m < left.Count; m++)
                    {
                        currentConnected.Remove(left[m]);
                        Tool.Log("Player \"" + left[m] + "\" disconnected from the server");
                    }
                }
                catch /*(Exception ex)*/
                {
                    //pendingPlayerUpdate = true;
                }
            }
            else if (data[i].StartsWith("L") && data[i].Contains(".smx") && data[i].Contains("\"") && !data[i].Contains("changed cvar"))
            {
                serverCommands.Add(data[i]);

                Tool.Log(data[i].Substring(data[i].IndexOf('\"')));
            }
            else if (data[i].StartsWith("*** Map Load:"))
            {
                if (data[i - 2] != "Server waking up from hibernation")
                {
                    string mapName = data[i].Substring("*** Map Load: ".Length);
                    mapName = mapName.Substring(0, mapName.IndexOf(':'));
                    Tool.Log("Map changed to: " + mapName);
                }
            }
            else if (data[i].StartsWith("Host_NewGame on map"))
            {
                string mapName = data[i].Substring("Host_NewGame on map ".Length);
                Tool.Log("Map changed to: " + mapName);
            }
            else if (data[i].Contains(":"))
            {
                if (data[i].StartsWith("Console:"))
                    Tool.Log(data[i]);
                else
                {
                    foreach (Player player in players)
                    {
                        if (data[i].StartsWith(player.Name) ||
                            data[i].StartsWith("(Terrorist) " + player.Name) ||
                            data[i].StartsWith("(Counter-Terrorist) " + player.Name))
                            Tool.Log(data[i]);
                    }
                }
            }
        }

        if (autoUpdate && !autoUpdateTempBlock && data[i].ToLower().StartsWith("your server is out of date"))
        {
            autoUpdateTempBlock = true;

            if (currentConnected.Count > 0 && Tool.lstHandles.Count == 0)
            {

                //for (int j = 5; j > 0; j--) //Not displaying correctly, hard coding instead
                //{
                //    _ = Tool.MessageServer("server will update and restart in " + i + " minutes.", true);
                //    await Task.Delay(60000);
                //}

                _ = Tool.MessageServer("server will update and restart in 5 minutes.", true);
                await Task.Delay(60000);
                _ = Tool.MessageServer("server will update and restart in 4 minutes.", true);
                await Task.Delay(60000);
                _ = Tool.MessageServer("server will update and restart in 3 minutes.", true);
                await Task.Delay(60000);
                _ = Tool.MessageServer("server will update and restart in 2 minutes.", true);
                await Task.Delay(60000);
                _ = Tool.MessageServer("server will update and restart in 1 minute.", true);
                await Task.Delay(60000);

                await Tool.MessageServer("Server will shutdown in", true);

                await Task.Delay(1000);

                _ = Tool.MessageServer("5", true);
                await Task.Delay(1000);
                _ = Tool.MessageServer("4", true);
                await Task.Delay(1000);
                _ = Tool.MessageServer("3", true);
                await Task.Delay(1000);
                _ = Tool.MessageServer("2", true);
                await Task.Delay(1000);
                _ = Tool.MessageServer("1", true);
                await Task.Delay(1000);


                //for (int j = 5; j >= 0; j--)
                //{
                //    _ = Tool.MessageServer(j.ToString(), true);
                //    await Task.Delay(1000);
                //}

                foreach (string player in currentConnected)
                    await Tool.MessageServer("kick \"" + player + "\"", false);

                await Task.Delay(1000);
            }

            Tool.KillServer();

            Process updateServer = Tool.UpdateServer();
            if (updateServer != null)
            {
                await Task.Delay(10000);
                while (!updateServer.HasExited)
                    await Task.Delay(5000);

                SaveSettings();
                Tool.StartServer();
            }
            else
            {
                MessageBox.Show("Restart server manually", Info.programTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            autoUpdateTempBlock = false;
        }
    }

    lnkCurrentlyConnected.Text = "*Currently Connnected: " + currentConnected.Count;
    lblTotalConnections.Text = "Total Connnections: " + totalConnections;
    lnkUniqueConnecions.Text = "*Unique Connnections: " + uniqueConnections.Count;

    if (currentConnectedFirst /*|| pendingPlayerUpdate*/ || clientChange)
    {
        clientChange = false;
        await Tool.MessageServer("status", false);
        //pendingPlayerUpdate = true;
    }

    currentConnectedFirst = false;
    connectedDataLock = false;
}

Текст исключения: System.IndexOutOfRangeException: индекс находился за пределами массива.at CSGO_Server_Manager.CfrmMain.d__39.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.AsyncMethodBuilderCore. <> c.b__6_0 (состояние объекта)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...