[Ayuda] Alguna forma de detectar un jugador AFK?
#1

ME gustaria saber si hay una forma de detectar cuando un jugador minimiza el juego o apreta la tecla Escape, que no sea obteniendo las posiciones del jugador

Gracias.
Reply
#2

Se puede haciйndolo con 'GetTickCount'.

La cosa es que cuando un jugador pulsa la tecla 'ESC' o minimiza el juego, el servidor deja de enviar informaciуn hacia el jugador.
Reply
#3

Eso es lo que necesito, ahora, me podrias decir como usarlo? no tiene variables ni nada :S
Reply
#4

Lo que quieres hacer lo puedes lograr obteniendo el tiempo de la ъltima actualizaciуn que recibiу el jugador con GetTickCount y crear una funciуn que verifique si la ъltima actualizaciуn que recibiу fue hace mбs de 2 segundos.

pawn Код:
#include <a_samp>

//Creamos una variable para guardar el tiempo de la ъltima actualizaciуn
new pLastUpdate[MAX_PLAYERS];

public OnPlayerUpdate(playerid)
{
    //Obtenemos el tiempo de la ъltima actualizaciуn que recibiу el jugador
    //usando GetTickCount

    pLastUpdate[playerid] = GetTickCount();

    return true;
}
pawn Код:
forward bool:IsPlayerPaused(playerid);
bool:IsPlayerPaused(playerid)
{
    //Verificamos si la ъltima actualizaciуn que recibiу el jugador fue hace
    //mбs de 2 segundos obteniendo nuevamente el tiempo usando
    //GetTickCount y restбndole el tiempo de la ъltima actualizaciуn.

    if((GetTickCount) - pLastUpdate[playerid]) > 2000)
    {
        //El jugador estб en pausa.
        return true;
    }
   
    //La ъltima actualizaciуn que recibiу el jugador fue hace menos de 2 segundos,
    //el jugador no estб en pausa.
    return false;
}
Y si quieres, tambiйn puedes simplificar la funciуn usando el operador ternario o define.

pawn Код:
forward bool:IsPlayerPaused(playerid);
bool:IsPlayerPaused(playerid)
{
    return ((GetTickCount) - pLastUpdate[playerid]) > 2000) ? true : false;
}
pawn Код:
#define IsPlayerPaused(%1) ((GetTickCount) - pLastUpdate[%1]) > 3000)
Reply
#5

No hay que confundir minimizado (o en pausa) con afk: http://forum.sa-mp.com/showpost.php?...0&postcount=12

Uno puede estar AFK que OnPlayerUpdate se seguirнa llamando.
Reply
#6

Si quieres detectar si un jugador se encuentra AFK (Away from keyboard o alejado del teclado), lo mejor que puedes hacer es chequear posiciones o la cбmara y el chat.

Si quieres detectar si un jugador minimizo el juego, deberбs utilizar el callback OnPlayerUpdate para realizar algunas comparaciones.

Sin embargo, existen varios includes/filterscripts para ambos casos, por lo que no hay necesidad de reinventar la rueda. Varios de los mismos se encuentran y podrбs encontrarlos con el buscador muy rбpidamente.

PD: Sugiero que cuando busques utilices la bъsqueda avanzada con el tag [Filterscript] o [Include] (segъn tus necesidades) y con el texto "AFK" o "OnPlayerPaused".
Reply
#7

Quote:
Originally Posted by LuiisRubio
Посмотреть сообщение
Lo que quieres hacer lo puedes lograr obteniendo el tiempo de la ъltima actualizaciуn que recibiу el jugador con GetTickCount y crear una funciуn que verifique si la ъltima actualizaciуn que recibiу fue hace mбs de 2 segundos.

pawn Код:
#include <a_samp>

//Creamos una variable para guardar el tiempo de la ъltima actualizaciуn
new pLastUpdate[MAX_PLAYERS];

public OnPlayerUpdate(playerid)
{
    //Obtenemos el tiempo de la ъltima actualizaciуn que recibiу el jugador
    //usando GetTickCount

    pLastUpdate[playerid] = GetTickCount();

    return true;
}
pawn Код:
forward bool:IsPlayerPaused(playerid);
bool:IsPlayerPaused(playerid)
{
    //Verificamos si la ъltima actualizaciуn que recibiу el jugador fue hace
    //mбs de 2 segundos obteniendo nuevamente el tiempo usando
    //GetTickCount y restбndole el tiempo de la ъltima actualizaciуn.

    if((GetTickCount) - pLastUpdate[playerid]) > 2000)
    {
        //El jugador estб en pausa.
        return true;
    }
   
    //La ъltima actualizaciуn que recibiу el jugador fue hace menos de 2 segundos,
    //el jugador no estб en pausa.
    return false;
}
Y si quieres, tambiйn puedes simplificar la funciуn usando el operador ternario o define.

pawn Код:
forward bool:IsPlayerPaused(playerid);
bool:IsPlayerPaused(playerid)
{
    return ((GetTickCount) - pLastUpdate[playerid]) > 2000) ? true : false;
}
pawn Код:
#define IsPlayerPaused(%1) ((GetTickCount) - pLastUpdate[%1]) > 3000)
No se tendrнa que tomar en cuenta el ping del jugador? Digo, para tener en cuenta en cuбnto tiempo el cliente enviarб la informaciуn hacia el servidor, o al menos eso creo.
Reply
#8

Para detectar el afk si presiona esc o minimiza el juego usa las nuevas funciones de 0.3z
pawn Код:
// Extended admin network stats
native NetStats_GetConnectedTime(playerid);
native NetStats_MessagesReceived(playerid);
native NetStats_BytesReceived(playerid);
native NetStats_MessagesSent(playerid);
native NetStats_BytesSent(playerid);
native NetStats_MessagesRecvPerSecond(playerid);
native Float:NetStats_PacketLossPercent(playerid);
native NetStats_ConnectionStatus(playerid);
native NetStats_GetIpPort(playerid, ip_port[], ip_port_len);
Una de esas se ponнa en 0 cuando estaba afk.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)