При проверки условия ловлю timed out

oleg_nelasy

Участник
Сообщения
664
Реакции
46
При проверке условия if(IsClientInGame(iPlayer) && !IsFakeClient(iPlayer) && !bMoveToCT[iPlayer] && GetClientTeam(iPlayer) > CS_TEAM_SPECTATOR) ловлю ошибку

L 10/26/2021 - 22:42:22: Info (map "de_dust2") (file "D:\HideAndSeek\csgo\addons\sourcemod\logs\errors_20211026.log")
L 10/26/2021 - 22:42:22: [SM] Exception reported: Script execution timed out
L 10/26/2021 - 22:42:22: [SM] Blaming: prophunt.smx
L 10/26/2021 - 22:42:22: [SM] Call stack trace:
L 10/26/2021 - 22:42:22: [SM] [1] Line 38, prophunt/teams.sp::UpdateTeams
L 10/26/2021 - 22:42:22: [SM] [2] Line 6, prophunt/events_round.sp::Event_OnRoundPreStart
int iPlayer;
while(iCTs >= iMaxCTs)
{
iPlayer = GetRandomInt(1, MaxClients);
if(IsClientInGame(iPlayer) && !IsFakeClient(iPlayer) && !bMoveToCT[iPlayer] && GetClientTeam(iPlayer) > CS_TEAM_SPECTATOR)
{
bMoveToCT[iPlayer] = true;
iCTs++;
}
}
 

Madness aka null138

Участник
Сообщения
713
Реакции
739
При проверке условия if(IsClientInGame(iPlayer) && !IsFakeClient(iPlayer) && !bMoveToCT[iPlayer] && GetClientTeam(iPlayer) > CS_TEAM_SPECTATOR) ловлю ошибку

L 10/26/2021 - 22:42:22: Info (map "de_dust2") (file "D:\HideAndSeek\csgo\addons\sourcemod\logs\errors_20211026.log")
L 10/26/2021 - 22:42:22: [SM] Exception reported: Script execution timed out
L 10/26/2021 - 22:42:22: [SM] Blaming: prophunt.smx
L 10/26/2021 - 22:42:22: [SM] Call stack trace:
L 10/26/2021 - 22:42:22: [SM] [1] Line 38, prophunt/teams.sp::UpdateTeams
L 10/26/2021 - 22:42:22: [SM] [2] Line 6, prophunt/events_round.sp::Event_OnRoundPreStart
int iPlayer;
while(iCTs >= iMaxCTs)
{
iPlayer = GetRandomInt(1, MaxClients);
if(IsClientInGame(iPlayer) && !IsFakeClient(iPlayer) && !bMoveToCT[iPlayer] && GetClientTeam(iPlayer) > CS_TEAM_SPECTATOR)
{
bMoveToCT[iPlayer] = true;
iCTs++;
}
}
потому что выполняется очень долго. насколько мне известно, кидает таймаут после 30 секунд выполнении функции.
какое значение у iMaxCTs ? или значение динамически присваивается исходя из чего то ?
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
потому что выполняется очень долго. насколько мне известно, кидает таймаут после 30 секунд выполнении функции.
какое значение у iMaxCTs ? или значение динамически присваивается исходя из чего то ?
Значение присваивается исходя настроек из кфг. В данном случаи было 2. Макс 20(может быть больше зависит от количества игроков)Я таким образам формирую баланс.
 

Madness aka null138

Участник
Сообщения
713
Реакции
739
Значение присваивается исходя настроек из кфг. В данном случаи было 2. Макс 20(может быть больше зависит от количества игроков)Я таким образам формирую баланс.
на сервере может быть игрок в наблюдателях или в процессе подключения. если ты ставишь по количеству игроков, то учитывай и это.
в твоем случае происходит примерно: iMaxCTs = 5, но проверку проходит только 4. и выполняется так до таймаута(30 сек.)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
А не лучше ли сделать массив, в котором будет список игроков удовлетворяющий условиям, а потом уже по нему прыгать?
И лучше не простой, а adt_array.
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
на сервере может быть игрок в наблюдателях или в процессе подключения. если ты ставишь по количеству игроков, то учитывай и это.
в твоем случае происходит примерно: iMaxCTs = 5, но проверку проходит только 4. и выполняется так до таймаута(30 сек.)
Я учитываю это вот полный код для наглядности. Проблема что когда попадаю в вил лаг и ошибка при этот не получается сформировать список игроков.


C-подобный:
void UpdateTeams()
{
    CleanUpQueue();
 
    int iPlayers;
    int iMaxCTs = GetMaxAllowedSeekers(iPlayers);
 
 
 
    // Get CTs
    bool bMoveToCT[MAXPLAYERS + 1];
    int iCTs;
 
    // Player queue
    int iNext;
    while((iNext = GetClientQueueNext()) != -1)
    {
        if(iCTs > iMaxCTs)
            break;
     
        RemoveFromArray(g_aQueue, 0); // Remove him from queue
     
        bMoveToCT[iNext] = true;
        iCTs++;
        //iPlayers--;
    }
 
    if(iPlayers > 1)
    {
        //Формирую команду кт если игроков недостаточно
        int iPlayer;
        while(iCTs >= iMaxCTs)
        {
            iPlayer = GetRandomInt(1, MaxClients);
            if(IsClientInGame(iPlayer) && !IsFakeClient(iPlayer) && !bMoveToCT[iPlayer] && GetClientTeam(iPlayer) > CS_TEAM_SPECTATOR)
            {
                bMoveToCT[iPlayer] = true;
                iCTs++;
            }
        }
     
        //Перед спавном проверю
        LoopIngamePlayers(i)
        {
            if(bMoveToCT[i] && GetClientTeam(i) <= CS_TEAM_SPECTATOR)
            {
                bMoveToCT[i] = false;
                iCTs--;
             
                while(iCTs >= iMaxCTs)
                {
                    iPlayer = GetRandomInt(1, MaxClients);
                    if(IsClientInGame(iPlayer) && !IsFakeClient(iPlayer) && !bMoveToCT[iPlayer] && GetClientTeam(iPlayer) > CS_TEAM_SPECTATOR)
                    {
                        bMoveToCT[iPlayer] = true;
                        iCTs++;
                    }
                }
            }
        }
    }
 
    //спавн игроков
    int iSpawnCT;
    LoopIngameClients(i)
    {
        if(IsClientSourceTV(i))
            continue;
         
        if(GetClientTeam(i) == CS_TEAM_SPECTATOR)
            continue;
     
        if(bMoveToCT[i] && iSpawnCT <= iMaxCTs)
        {
            MovePlayerToTeam(i, CS_TEAM_CT); // Ignored when player is already on CT side
            bMoveToCT[i] = false;
            iSpawnCT++;
        }
        else MovePlayerToTeam(i, CS_TEAM_T);
    }
}

//Устанавливаем максимально количество искателей
int GetMaxAllowedSeekers(int &iCount)
{
    LoopIngameClients(i)
    {
        if(IsClientSourceTV(i))
            continue;
         
        if(GetClientTeam(i) < CS_TEAM_SPECTATOR)
            continue;
     
        iCount++;
    }
 
    if(iCount == 1)
        return 1;
 
    for (int i = 0; i < sizeof(g_cvBalancer); i++)
    {
        if(iCount >= g_cvBalancer[i][0].IntValue)
            PrintToChatAll("g_cvBalancer[i][0] = [%d]", g_cvBalancer[i][0].IntValue);
            PrintToChatAll("g_cvBalancer[i][1] = [%d]", g_cvBalancer[i][1].IntValue);
            return g_cvBalancer[i][1].IntValue;
    }
 
    return 1;
}
 
Последнее редактирование:

Madness aka null138

Участник
Сообщения
713
Реакции
739
C-подобный:
int GetMaxAllowedSeekers(int &iCount)
{
    LoopIngameClients(i)
    {
        if(IsClientSourceTV(i))
            continue;
          
        if(GetClientTeam(i) < CS_TEAM_SPECTATOR)
            continue;
      
        iCount++;
    }
  
    if(iCount == 1)
        return 1;
  
    for (int i = 0; i < sizeof(g_cvBalancer); i++)
    {
        if(iCount >= g_cvBalancer[i][0].IntValue)
            PrintToChatAll("g_cvBalancer[i][0] = [%d]", g_cvBalancer[i][0].IntValue);
            PrintToChatAll("g_cvBalancer[i][1] = [%d]", g_cvBalancer[i][1].IntValue);
            return g_cvBalancer[i][1].IntValue;
    }
  
    return 1;
}
тут нет проверок которых ты поставил сверху в цикле. получается что этот присваивает всех, а на проверке ты исключаешь некоторых и значение не доходит до нужного.
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
А не лучше ли сделать массив, в котором будет список игроков удовлетворяющий условиям, а потом уже по нему прыгать?
И лучше не простой, а adt_array.
Можно пример пожалуйста?
тут нет проверок которых ты поставил сверху в цикле. получается что этот присваивает всех, а на проверке ты исключаешь некоторых и значение не доходит до нужного.
В данном коде идет поищет игроков и потом сравнение по кварам как только условие выполнилось возвращает значение кварам или единицу если не выполнилось. Прошу прошения забыл принты убрать был в процессе написания проверки.
И потом присваиваю это значение для iMaxCTs. iMaxCTs - сколько игроков может играть за кс остальные Т
Сообщения автоматически склеены:

@Muinez,Простите я дурак, спасибо(
 
Последнее редактирование:
Сверху Снизу