Не обнуляется массив при рестарте

ElectricStalin

Участник
Сообщения
24
Реакции
0
Добрый день.

Столкнулся с багом, который никак не удается исправить. В моем плагине игровая сессия состоит из 2 раундов. Первый-разминочный, продолжается до момента, как подключатся все игроки. Второй основной - обычный 6 минутный ДМ раунд.
В процессе игры есть возможность подбирать и использовать неограниченное количество оружия. Все оно хранится в массиве clientsWeapon[client][]. Мне посоветовали хранить не индексы оружия, а ссылки на индексы.
В процессе разминочного раунда все работает, как часы. Но после старта основного раунда все ломается из-за того, что в массиве на месте ненулевых элементов появляются индексы -1. Здесь я обнуляю массив:
C-подобный:
public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{

   int j=1;
    if (g_iGameState == STATE_MATCH)
    {
        CreateTimer(362.0, EndGame, _, TIMER_FLAG_NO_MAPCHANGE);
    }
        for(int client=1;client<GetMaxClients();client++)
    {

        while(clientsWeapon[client][j]!=0)
        {
            RemoveEdict(EntRefToEntIndex(clientsWeapon[client][j]));
            weaponAmmo[client][j]=0;
            clientsWeapon[client][j]=0;
            j++;
        }
        weaponInHand[client]=0;
    }
 
        SpawnWeapons();
}
начинаю основной раунд командой mp_restartgame 1

Пример:
Содержание массива на конец разминочного раунда clientsWeapon[1] = {0, -123123, -321321,0,...,0}
Содержание массива на начало основного раунда clientsWeapon[1] = {0, -1, -1, 0,...,0} (здесь не совсем содержание массива, в логи выводил EntRefToEntIndex уже. То есть в массиве такие ссылки, которые ведут на индексы -1).
Плагин очень объемный, весь код нет смысла сюда выкладывать. Если, чтобы разобраться, нужны еще какие-то части, выложу.
PS Вчера пытался исправить в течение 4 часов, отключил весь доп функционал, результат нулевой. Очень надеюсь на вашу помощь.
 
Последнее редактирование:

ElectricStalin

Участник
Сообщения
24
Реакции
0

diller110

Добрая душа
Сообщения
353
Реакции
278
Минимум 2 проблемы: 1 - переменная j не сбрасывается, а значит если у первого игрока проверялись индексы 1-5, то у второго от 5-10, третьего 10-15.
2 - в цикле while нет ограничения j, может выйти за пределы массива.
PHP:
public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{

   int j=1;   // j = 1
    if (g_iGameState == STATE_MATCH)
    {
        CreateTimer(362.0, EndGame, _, TIMER_FLAG_NO_MAPCHANGE);
    }
    for(int client=1;client<GetMaxClients();client++)
    {
        /* j = 0; */
        while(clientsWeapon[client][j]!=0 /*&& j<sizeof(clientWeapon[]) */)  {  // j = 1, 2, 3, 4, 5, .....
            RemoveEdict(EntRefToEntIndex(clientsWeapon[client][j]));
            weaponAmmo[client][j]=0;
            clientsWeapon[client][j]=0;
            j++;  // j = 1, 2, 3, 4, 5, .....
        }
        weaponInHand[client]=0;
    }
 
   SpawnWeapons();
}
 

ElectricStalin

Участник
Сообщения
24
Реакции
0
Минимум 2 проблемы: 1 - переменная j не сбрасывается, а значит если у первого игрока проверялись индексы 1-5, то у второго от 5-10, третьего 10-15.
2 - в цикле while нет ограничения j, может выйти за пределы массива.
PHP:
public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{

   int j=1;   // j = 1
    if (g_iGameState == STATE_MATCH)
    {
        CreateTimer(362.0, EndGame, _, TIMER_FLAG_NO_MAPCHANGE);
    }
    for(int client=1;client<GetMaxClients();client++)
    {
        /* j = 0; */
        while(clientsWeapon[client][j]!=0 /*&& j<sizeof(clientWeapon[]) */)  {  // j = 1, 2, 3, 4, 5, .....
            RemoveEdict(EntRefToEntIndex(clientsWeapon[client][j]));
            weaponAmmo[client][j]=0;
            clientsWeapon[client][j]=0;
            j++;  // j = 1, 2, 3, 4, 5, .....
        }
        weaponInHand[client]=0;
    }
 
   SpawnWeapons();
}
Да, спасибо, сейчас заменил while for от 0 до максимального размера массива. Вроде бы все работает.
 
Сверху Снизу