idle kicker
#1

how can i check if a player isn't moving for 10 seconds?
Reply
#2

https://sampwiki.blast.hk/wiki/GetPlayerPos
https://sampwiki.blast.hk/wiki/SetPVarFloat
https://sampwiki.blast.hk/wiki/SetTimerEx
https://sampwiki.blast.hk/wiki/GetPVarFloat

I suggest you search an FS about AFK system/kicker.
Reply
#3

i tried, but it doesn't work... look at my script:
pawn Код:
new bool:Afk[MAX_PLAYERS];
new AfkTimer[MAX_PLAYERS];
new Float:LastPos[MAX_PLAYERS][3];

public OnPlayerConnect(playerid)
{
    Afk[playerid] = false;
}

public OnPlayerUpdate(playerid)
{
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    if(!Afk[playerid] && x == LastPos[playerid][0] && y == LastPos[playerid][1] && z == LastPos[playerid][2])
    {
        AfkTimer[playerid] = SetTimerEx("SetPlayerAfk", 10000, 0, "%d", playerid);
    }
    else
    {
        Afk[playerid] = false;
        KillTimer(AfkTimer[playerid]);
        GetPlayerPos(playerid, LastPos[playerid][0], LastPos[playerid][1], LastPos[playerid][2]);
    }
}

forward SetPlayerAfk(playerid);
public SetPlayerAfk(playerid)
{
    SendClientMessage(playerid, 0xFFFFFF, "You are AFK.");
    Afk[playerid] = true;
}
it doesn't work...
Reply
#4

pawn Код:
new bool:Afk[MAX_PLAYERS];
new AfkTimer[MAX_PLAYERS];
new Float:LastPos[MAX_PLAYERS][3];

forward SetPlayerAfk(playerid);

public OnPlayerConnect(playerid)
{
    Afk[playerid] = false;
    AfkTimer[playerid] = SetTimerEx("SetPlayerAfk",10000,1,"d",playerid);//10 seconds?
}

public OnPlayerDisconnect(playerid,reason)
{
    KillTimer(AFKTimer[playerid]);
    return 1;
}

public OnPlayerSpawn(playerid)
{
    GetPlayerPos(playerid,LastPos[playerid][0],LastPos[playerid][1],LastPos[playerid][2]);
    return 1;
}

public SetPlayerAfk(playerid)
{
    new Float:Pos[3];
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    if(Pos[0] == LastPos[playerid][0] && Pos[1] == LastPos[playerid][1] && Pos[2] == LastPos[playerid][2])
    {
        SendClientMessage(playerid, 0xFFFFFF, "You are AFK.");
        Afk[playerid] = true;
    }
    else
    {
        Pos[0] = LastPos[playerid][0];
        Pos[1] = LastPos[playerid][1];
        Pos[2] = LastPos[playerid][2];
    }
    return 1;
}
Reply
#5

it's sending a lot of messages that says "You are AFK" even when i'm not afk...
and i'm checking if i'm afk with this:
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    if(!strcmp("/check", cmdtext, true))
    {
        if(Afk[playerid])return SendClientMessage(playerid, 0xFFFFFFFF, "Afk");
        return SendClientMessage(playerid, 0xFFFFFFFF, "Not Afk");
    }
    return 0;
}
it's always says "Not Afk".
Reply
#6

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    if(!strcmp("/check", cmdtext, true))
    {
        if(Afk[playerid] == true) return SendClientMessage(playerid, 0xFFFFFFFF, "Afk");
        return SendClientMessage(playerid, 0xFFFFFFFF, "Not Afk");
    }
    return 0;
}
I don't see any mistake on my code. Perhaps I missed something.
Reply
#7

nvm, i solved it
if you want to know how i did it:
pawn Код:
new bool:Afk[MAX_PLAYERS];
new AfkTimer[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
    Afk[playerid] = false;
}

public OnPlayerUpdate(playerid)
{
    new Keys,ud,lr;
    GetPlayerKeys(playerid,Keys,ud,lr);
    if(ud == 0 && lr == 0)
    {
        AfkTimer[playerid] = SetTimerEx("SetPlayerAfk", 10000, 0, "%d", playerid);
    }
    else
    {
        Afk[playerid] = false;
        KillTimer(AfkTimer[playerid]);
    }
    return 1;
}

forward SetPlayerAfk(playerid);
public SetPlayerAfk(playerid)
{
    Afk[playerid] = true;
}
Reply
#8

OnPlayerUpdate called when player do something in client side. So how can it called if player AFKing?
I never dealing with OnPlayerUpdate so IDK How this callback works.
Reply
#9

i checked if a player is pressing the movement keys, it's very simple...
Reply
#10

I know. I just don't know if OnPlayerUpdate called even we do nothing.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)