[FilterScript] Mini sistema AFK com auto-kick
#1

Й um mini-sistema AFK com auto-kick no player que estiver AFK, parado ou de ESC por 10 minutos.

Comandos
/afk > fica AFK
/voltar > volta
/ausentes > mostra quem estб AFK

Cуdigo
pawn Код:
/*
                            Sistema AFK com Auto-Kick

                            Feito por [XPG]MarlonCS
                              Skype: marloncs_22
*/


//includes
#include <a_samp>
#include <zcmd>

// defines
#define cinza 0xBEBEBEFF
#define laranja 0xFFA500FF
#define verde_claro 0x00FF00FF
#define vermelho 0xFF0000FF

// forwards
forward ChecarAfk(playerid);
forward AtualizarAfk(playerid);
forward ChecarPosicao(playerid,Float:afkX,Float:afkY,Float:afkZ);

// news
new
   bool:AFKCMD[MAX_PLAYERS],
   AfkCount[MAX_PLAYERS],
   Text:afk[MAX_PLAYERS],
   timeafk[MAX_PLAYERS],
   Float:Position[3],
   AFK[MAX_PLAYERS],
   string[256]
;

public OnFilterScriptInit()
{
    SetTimer("ChecarPosicao", 600000, true); // Se o player ficar parado por 10 minutos, ele й tido como AFK
    SetTimer("ChecarAfk", 1000, true); // De um em um segundo chega o tempo do player AFK, caso ele esteja 10 minutos, ele й kickado
    print("\nSisteminha AFK carregado *.* -------");
    print("----------------------by [XPG]MarlonCS\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

public OnPlayerConnect(playerid)
{
    CriarTextDraw(playerid);
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    if(AFKCMD[playerid]==true) // Se o player sair enquanto tiver AFK antes de usar /voltar
    {
        AFK[playerid]=0;
        AFKCMD[playerid]=false;
    }
    return 1;
}

CMD:afk(playerid, params[])
{
    if(AFKCMD[playerid] == true) { SendClientMessage(playerid, cinza, "[SERVER] Vocк jб estб ausente!"); }
    AFK[playerid]=1;
    AFKCMD[playerid]=true;
    TogglePlayerControllable(playerid,0);
    TextDrawShowForPlayer(playerid,afk[playerid]);
    timeafk[playerid] = SetTimer("AtualizarAfk", 60000, true);
    format(string, sizeof(string), "[SERVER] %s estб ausente. ( /afk )", pnome(playerid));
    SendClientMessageToAll(laranja, string);
    return 1;
}

CMD:voltar(playerid, params[])
{
    if(AFKCMD[playerid] == false) { SendClientMessage(playerid, cinza, "[SERVER] Vocк nгo estб ausente!"); }
    AFK[playerid]=0;
    AFKCMD[playerid]=false;
    TogglePlayerControllable(playerid,1);
    TextDrawHideForPlayer(playerid,afk[playerid]);
    KillTimer(timeafk[playerid]);
    format(string, sizeof(string), "[SERVER] %s voltou ao jogo. ( /voltar )", pnome(playerid));
    SendClientMessageToAll(laranja, string);
    return 1;
}

CMD:ausentes(playerid, params[])
{
    new arm[500];
    new str[500];
    new Nome[24];
    new count;
    for(new i=0;i<MAX_PLAYERS;i++) {
        if(IsPlayerConnected(i)) {
            if(AFK[i] > 0) {
                count++;
                GetPlayerName(i, Nome, sizeof(Nome));
                format(str, sizeof(str),"{FFFFFF}Nome: {FFA500}%s {FFFFFF}[%i]\n", Nome, i);
                strcat(arm, str);
            }
        }
    }
    if(count<=0)return ShowPlayerDialog(playerid, 10, DIALOG_STYLE_MSGBOX, "===== {FFA500}Ausentes{FFFFFF} ======", "{00FF00}Nenhum player ausente", "OK", "");
    if(count>0)ShowPlayerDialog(playerid, 10, DIALOG_STYLE_MSGBOX, "===== {FFA500}Ausentes{FFFFFF} ======", arm, "OK", "");
    return 1;
}

public OnPlayerUpdate(playerid)
{
    GetPlayerPos(playerid, Position[0], Position[1], Position[2]); // Getar posiзгo
    if(AFK[playerid] == 1 && AfkCount[playerid] > 0 && AFKCMD[playerid]==false) // Se o player se mover
    {
        AfkCount[playerid] = 0;
        AFK[playerid]=0;
        KillTimer(timeafk[playerid]);
    }
    return 1;
}

stock CriarTextDraw(playerid)
{
    afk[playerid] = TextDrawCreate(260.000000,222.000000,"~r~AFK ~w~( sair: ~g~/voltar~w~ )");
    TextDrawSetOutline(afk[playerid], 1);
    TextDrawFont(afk[playerid], 2);
    TextDrawSetProportional(afk[playerid], true);
    TextDrawAlignment(afk[playerid], 1);
    TextDrawLetterSize(afk[playerid], 0.4, 3.0);
    TextDrawSetShadow(afk[playerid], 1);
    return 1;
}
public AtualizarAfk(playerid)
{
    AfkCount[playerid]++; // De um em um minuto soma mais 1
    return 1;
}
public ChecarPosicao(playerid,Float:afkX,Float:afkY,Float:afkZ) // Checar se o player estб parado
{
    GetPlayerPos(playerid,afkX,afkY,afkZ);
    if (Position[0] == afkX && Position[1] == afkY && Position[2] == afkZ)
    {
        AFK[playerid]=1;
        timeafk[playerid] = SetTimer("AtualizarAfk", 60000, true);
    }
    return 1;
}
public ChecarAfk(playerid)
{
    if(AFK[playerid]==1 && AfkCount[playerid] > 10) { // Verifica se o player estб afk por 10 minutos
        SendClientMessage(playerid, vermelho, "[SERVER] Vocк foi kickado por estar AFK por muito tempo!");
        Kick(playerid);
        format(string, sizeof string, "[SERVER] %s foi kickado por estar AFK por 10 minutos.", pnome(playerid));
        SendClientMessageToAll(vermelho, string);
    }
    return 1;
}
stock pnome(playerid)
{
    new nome[32];
    GetPlayerName(playerid, nome, sizeof(nome));
    return nome;
}
AMX: aqui
Reply


Messages In This Thread
Mini sistema AFK com auto-kick - by [XPG]MarlonCS - 20.07.2012, 18:54
Re: Mini sistema AFK com auto-kick - by Ades - 20.07.2012, 19:05
Re: Mini sistema AFK com auto-kick - by FrostGF - 20.07.2012, 19:18
Re: Mini sistema AFK com auto-kick - by CidadeNovaRP - 20.07.2012, 19:22
Re: Mini sistema AFK com auto-kick - by [XPG]MarlonCS - 20.07.2012, 19:23
Re: Mini sistema AFK com auto-kick - by [XPG]MarlonCS - 20.07.2012, 19:25
Re: Mini sistema AFK com auto-kick - by @Riichard - 20.07.2012, 19:26
Re: Mini sistema AFK com auto-kick - by [XPG]MarlonCS - 20.07.2012, 19:28
Re: Mini sistema AFK com auto-kick - by CidadeNovaRP - 20.07.2012, 19:30
Re: Mini sistema AFK com auto-kick - by Ades - 20.07.2012, 19:32

Forum Jump:


Users browsing this thread: 2 Guest(s)