PDA

Просмотр полной версии : [Вопрос] Участники



Skyline
26.04.2017, 16:40
Выводит только одного человека который на зоне, остальных не показывают, подскажите в чем ошибка?


foreach(Player, i)
{
if(!IsPlayerConnected(i)) continue;
if(InZone[i] == false) continue;
new string[MAX_PLAYER_NAME*20],
players;

players++;
format(string, sizeof string, "{FFDEAD}%s[%d]\n",pInfo[i][pName], i);
ShowPlayerDialog(playerid, dDm_Players, DIALOG_STYLE_MSGBOX, !"{FFFFFF}Участники", string, !"Обновить", !"Назад");
}

vovandolg
26.04.2017, 16:44
По моему такую ошибку с таким же кодом кто то кидал сюда и её решали,
я даже функцию давал как правильно пинать игрока с зоны...

DeimoS
26.04.2017, 16:50
new string[MAX_PLAYER_NAME*20],
players;
foreach(Player, i)
{
if(InZone[i] == false) continue;

players++;
format(string, sizeof string, "%s{FFDEAD}%s[%d]\n", string, pInfo[i][pName], i);
}
ShowPlayerDialog(playerid, dDm_Players, DIALOG_STYLE_MSGBOX, !"{FFFFFF}Участники", string, !"Обновить", !"Назад");

VVWVV
26.04.2017, 16:54
Лучше создать отдельный итератор, который будет содержать идентификаторы игроков. Перебор игроков получится чуть быстрее, поскольку в цикле не будет проверяться нахождение игрока на сервере и на зоне (урок (http://pro-pawn.ru/showthread.php?15081)). Кстати, переменную players можно удалить, поскольку вместо неё можно использовать Iter_Count.

Ещё, я думаю, лучше инициализировать массив и переменные вне цикла, ибо при каждой итерации будет создаваться новый массив, а после завершения итерации - освобождаться. Очевидно, что выполнение таких действий замедлит работу кода.

Пример:


// В глобальной области видимости
new Iteartor:ZoneIter[MAX_PLAYERS /* или любое другое значение, например, максимальное количество игроков на зоне */];

// В функции
new string[MAX_PLAYER_NAME * 20];

foreach(new i : ZoneIter) {
format(string, sizeof string, "%s{FFDEAD}%s[%d]\n", string, pInfo[i][pName], i);
}

ShowPlayerDialog(playerid, dDm_Players, DIALOG_STYLE_MSGBOX, !"{FFFFFF}Участники", string, !"Обновить", !"Назад");