А теперь встряну я :hi:
По поводу OnPlayerUpdate. Он действительно может вызываться всего пару раз за секунду в случае, когда игрок совсем не двигается. Достаточно просто встать на месте, перестать двигать камеру и всё, клиент практически перестанет отсылать данные об игроке, ибо новых данных нет. Но тут ещё всё зависит не только от активности самого игрока, но и от настроек в server.cfg.
Но даже если бы он обновлялся 25 раз за секунду постоянно (пока игрок не свернёт игру). Вероятность того, что между обновлением OnPlayerUpdate и вызовом таймера вклинится какой-то другой коллбэк, в котором идёт проверка на АФК, довольно велика. И будет ложное срабатывание.
Люди ещё с времён 0.2x, когда добавили OnPlayerUpdate, сделали адекватную реализацию отслеживания АФК и какой смысл изобретать велосипед по новой? Особенно если этот велосипед гораздо хуже предыдущего.
Вариант с отсчётом времени в АФК
PHP код:
new pl_afk_time[MAX_PLAYERS];
public OnPlayerUpdate(playerid)
{
pl_afk_time[playerid] = -1;
}
public OnGameModeInit()
{
SetTimer("UpdateAfkTime", 1000, true);
}
forward UpdateAfkTime();
public UpdateAfkTime()
{
for(new i = GetMaxPlayers()-1; i != -1; i--)
{
if(!IsPlayerConnected(i)) continue;
pl_afk_time[i]++;
if(pl_afk_time[i] > 1)
{
printf("Игрок с ID %d находится в AFK [%d секунд]", i, pl_afk_time[i]);
}
}
}
Без отсчёта времени
PHP код:
new pl_afk_time[MAX_PLAYERS char];
public OnPlayerUpdate(playerid)
{
pl_afk_time{playerid} = 0;
}
public OnGameModeInit()
{
SetTimer("UpdateAfkTime", 1000, true);
}
forward UpdateAfkTime();
public UpdateAfkTime()
{
for(new i = GetMaxPlayers()-1; i != -1; i--)
{
if(!IsPlayerConnected(i)) continue;
if(pl_afk_time{i} < 2) pl_afk_time{i}++;
}
}
if(pl_afk_time{i} == 2) print("Игрок в AFK");
Всё. Осталось лишь чуть подкорректировать время в UpdateAfkTime, через которое игрок считается неактивным и система будет работать как часы