С чего бы GetMaxPlayers вернёт 0?
Вид для печати
А ещё можно создать новый итератор в foreach и проверять только тех, кто действительно авторизируется :3 Но это уж совсем для извращенцев.
Я бы всё же остановился на варианте с индивидуальными таймерами или убивал бы таймер, если на данный момент никто не авторизируется. Как-то попусту гонять цикл, как по мне, не комильфо
Итератор займёт 4004 байта (MAX_PLAYERS + 1 ячеек). Сомнительная польза, особенно на фоне того, что Londlem изначально решил сэкономить с размером массива под время.
PHP код:
static auth_countdown_time[MAX_PLAYERS char];
static auth_countdown_total_players = 0;
static auth_countdown_func_name[] = !"@__AuthCountdownTimer";
static auth_countdown_timer;
StartAuthCountdown(playerid, time)
{
auth_countdown_time{playerid} = time;
if (auth_countdown_total_players++ == 0)
auth_countdown_timer = SetTimer(auth_countdown_func_name, 1000, true);
}
StopAuthCountdown(playerid)
{
auth_countdown_time{playerid} = 0;
if (--auth_countdown_total_players == 0)
KillTimer(auth_countdown_timer);
}
@__AuthCountdownTimer();
@__AuthCountdownTimer()
{
#if defined foreach && !defined FOREACH_NO_PLAYERS
foreach(Player:i)
#else
static i;
for (i = GetPlayerPoolSize() + 1; i-- != 0;) if (IsPlayerConnected(i))
#endif
{
if ((auth_countdown_time{i} != 0) && (--auth_countdown_time{i} == 0))
{
SendClientMessage(i,-1,"Время на регистрацию/авторизацию истекло.");
Kick(i);
}
}
}
И так я случайно изобрёл новый инклуд. Опять.
Ну, во-первых, зависит от того, какое число скрывается за MAX_PLAYERS :D
Во-вторых, если ставить перед собой цель сделать максимально "лёгкий" код, боясь выделить пару лишних байт, то да - такой метод не подойдёт. Но, как по мне, быстродействие и минимальна нагрузка оправдывают подобный жор памяти.
Тем более, что такой итератор можно использовать не только для цикла, но и реализовать другие системы (например, проверку на авторизацию сделать более функциональней, проверяя наличие игрока в итераторе). Зависит от конкретной ситуации