Solved client_disconnected problem?

Сообщения
278
Реакции
137
Hello,
I want to change index after someone left the game but sometimes bug happens.
I will give an example and you'll see the problem.

Happens;
Код:
(He dropped)
empty dropped.
empty has left the game.

(Next terrorist did not change. It was still empty even if he left the server.)
empty left the game, next terrorist is empty.
Код:
new pNextTerrorist;

public client_disconnected(pPlayer) {
    new iPlayers[32], iNum;
    get_players(iPlayers, iNum);
    //... inum checks

    if(pNextTerrorist == pPlayer) {
        pNextTerrorist = iPlayers[random(iNum)];
        rg_set_user_team(pNextTerrorist, TEAM_TERRORIST);
        client_print_color(0, 0, "%L", LANG_PLAYER, "REDEATHRUN_LEFT_GAME", pPlayer, pNextTerrorist);
    }
}
 
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)
В рамках 'disconnected' игрок ещё считается подключённым т.е. выборка get_players() включает его в массив. Понимаешь? Тебе нужно проверять что рандом выбрал не его же.
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Код:
while(pNextTerrorist != pPlayer)
    pNextTerrorist = iPlayers[random(iNum)];
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Nordic Warrior, вечный луп же
30 Янв 2021
Ручками в цикле собрать нужных игроков и рэндмить уже готовых игроков.
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
PurposeLess, Collect players in owned array at loop instead of get_players.
 
Сообщения
278
Реакции
137
Does it work?

Код:
public client_disconnected(pPlayer) {
    pNextTerrorist = RandomPlayer(pPlayer);
}

RandomPlayer(const NotIncludedPlayer) {
    ArrayClear(g_aConnectedPlayers);

    for(new pPlayer = 1; pPlayer <= MaxClients; pPlayer++) {
        if(!is_user_connected(pPlayer) || pPlayer == NotIncludedPlayer) { // I think I don't need NotIncludedPeople here. First checks too.
            continue;
        }

        ArrayPushCell(g_aConnectedPlayers, pPlayer);
    }

    return ArrayGetCell(g_aConnectedPlayers, random(ArraySize(g_aConnectedPlayers))); // or random_num(1, ...) ?
}
 
Сообщения
64
Реакции
131
Помог
4 раз(а)
Код:
new pNextTerrorist;

public client_disconnected(pPlayer) {
    new iPlayers[32], iNum;
    get_players(iPlayers, iNum);
    //... inum checks
    if(iNum == 1 || pNextTerrorist != pPlayer) {
        return;
    }
    
    while (pNextTerrorist == pPlayer) {
        pNextTerrorist = iPlayers[random(iNum)];
    }

    rg_set_user_team(pNextTerrorist, TEAM_TERRORIST);
    client_print_color(0, 0, "%L", LANG_PLAYER, "REDEATHRUN_LEFT_GAME", pPlayer, pNextTerrorist);
}
 

d3m37r4

111111
Сообщения
1,454
Реакции
1,194
Помог
10 раз(а)
Создайте вы массив, циклом for последовательно сохраните в этот массив индексы, исключая индекс игрока, который отсоединился от сервера и работайте дальше с этим массивом, как сказал fl0wer
 
Сообщения
278
Реакции
137
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Код:
    new playersNum;
    new playersArray[MAX_PLAYERS];

    for (new i = 1; i <= MaxClients; i++)
    {
        if (i == id)
            continue;

        if (!is_user_connected(i))
            continue;

        playersArray[++playersNum] = i;
    }

    if (playersNum)
    {
        new nextTerrorist = playersArray[random_num(0, playersNum - 1)];
        // actions
    }
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу