31.03.2012, 10:39
(
Последний раз редактировалось AndreT; 31.03.2012 в 10:42.
Причина: Added connection check
)
I will not give you an exact full working code since you should do some searching on your own, however I can tell you that OnPlayerUpdate is not called when the player is not in-game (paused or alt-tabbed).
Sometimes I see people doing this with GetTickCount() and then comparing times, but this isn't actually necessary. All you need is a variable that is getting reset in the OnPlayerUpdate callback and incremented in an one-second timer.
Starting from around 5 seconds, you can also probably effectively tell for how long the player has been away from the game.
Perhaps I should make some sort of a library for AFK detection this way. Unsure at this point, but keep in mind the code probably does not work, but it should give you a good idea how it is supposed to work.
Sometimes I see people doing this with GetTickCount() and then comparing times, but this isn't actually necessary. All you need is a variable that is getting reset in the OnPlayerUpdate callback and incremented in an one-second timer.
pawn Код:
new AFK[MAX_PLAYERS];
// ...
public OnGameModeInit()
{
// Run a timer here
SetTimer("CheckAFK", 1000, true);
}
// ...
public OnPlayerUpdate(playerid)
{
// If the player just came back from being afk, the AFK variable is most likely more than 3/5 (vary this based on your gamemode and experience)
if(AFK[playerid] > 3)
{
// This player just came back from being AFK
}
AFK[playerid] = 0;
}
// ...
forward CheckAFK();
public CheckAFK()
{
// Suggestions for loop: either use foreach or at least define MAX_PLAYERS to your server's server.cfg amount!
for(new i = 0; i != MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) continue;
AFK[i] ++;
if(AFK[i] == 3)
{
// The player most likely just went AFK!
}
}
}
pawn Код:
format(string, sizeof(string), "%s(%i) has been away from keyboard for %d seconds.", PlayerName, playerid, AFK[playerid]);
SendClientMessageToAll(-1, string);