10.06.2012, 21:43
(
Последний раз редактировалось billy the kid; 04.06.2013 в 01:51.
)
new times
new tempo[MAX_PLAYERS]; // topo do gm
public OnGameModeInit()
{
SetTimerEx( "afk", 1000, true, "i", playerid );// isso daqui diz que й para executar a funзгo afk a cada 1 segundo.
}
forward afk(playerid);
public afk(playerid)
{
tempo[playerid] = gettime() + (600); // Isto irб criar um timer para o playerid, ou seja para cada jogador.
new Float:x,Float:y,Float:z,Float:posicao[3]; // aqui sгo as vars que serгo armazenadas...
GetPlayerPos(playerid,x,y,z); // Aqui pega e salvar a posiзгo do jogador no momento que o timer foi ativado.
if(tempo[playerid] <= gettime()) // Ao final do timer, irб executar essa funзгo
{
GetPlayerPos(playerid,posicao[0],posicao[1],posicao[2]); // Aqui pega denovo a posiзгo do jogador
if (posicao[0] == x && posicao[1] == y && posicao[2] == z) // Aqui faz um comparaзгo das posiзхes, da posiзгo que foi salva lб encima, com estб posiзгo apуs o timer ter acabado, Se for igual irб executar a funзгo abaixo, kickando o jogador.
{
Kick(playerid);
}
}
}
Cуdigo feito, Alйm disso vem com um mini tutorial. e tambйm os crйditos especiais.
pawn Код:
Crйditos: Paulor - Aprendi com ele a usar o getimer. |
#include <a_samp>
new Text3D:esc;
forward CheckNewHealth(playerid);
forward CheckNewHealth2(playerid);
forward CheckTakenHealth(playerid);
forward BanIfHacker(playerid);
public CheckTakenHealth(playerid)
{
new Float:CurrHealth;
GetPlayerHealth(playerid,CurrHealth);
SetPVarFloat(playerid,"CurrHealth",CurrHealth);
SetTimerEx("CheckNewHealth2",1000,false,"i",playerid);
}
public CheckNewHealth2(playerid)
{
new Float:NewHealth2;
GetPlayerHealth(playerid,NewHealth2);
SetPlayerHealth(playerid,NewHealth2-1);
SetTimerEx("CheckNewHealth",1000,false,"i",playerid);
}
public CheckNewHealth(playerid)
{
new Float:NewHealth;
GetPlayerHealth(playerid,NewHealth);
SetPVarFloat(playerid,"NewHealth",NewHealth);
SetTimerEx("BanIfHacker",1000,false,"i",playerid);
}
public BanIfHacker(playerid)
{
SetTimerEx("CheckTakenHealth",1000,false,"i",playerid);
if(GetPVarFloat(playerid,"CurrHealth") == GetPVarFloat(playerid,"NewHealth"))
{
if(!IsPlayerAdmin(playerid))
{
SendClientMessage(playerid,-1,"Kikado por Suspeita de Health Hack (ou ESC)!");
new pname[MAX_PLAYER_NAME];
new string[256];
GetPlayerName(playerid,pname,sizeof(pname));
format(string,sizeof(string),"[ANTI-CHEAT]: %s foi Kikado por Suspeita de Health Hack (ou ESC)!",pname);
SendClientMessageToAll(-1,string);
new baninfo[256];
format(baninfo,sizeof(baninfo),"Vocк foi Kikado por Suspeita de Health Hack (ou ESC)\n\nCaso seja um engano acesse: www.seila.forumeiros.com!");
ShowPlayerDialog(playerid,1324,DIALOG_STYLE_MSGBOX,"Kikado!", baninfo,"OK","");
Kick(playerid);
esc = Create3DTextLabel("^~ ESC ~^", 0x00007CAA, 1.0, 1.0, 1.0, 40.0, 0);
Attach3DTextLabelToPlayer(esc, playerid, 0.0, 0.0, 0.4);
}
}
else
{
new Float:NewHealth;
GetPlayerHealth(playerid,NewHealth);
SetPlayerHealth(playerid,NewHealth+1);
Delete3DTextLabel(esc);
}
}
new Float: PTOldPos[MAX_PLAYERS][3], PTAFKTime[MAX_PLAYERS], PTAFKTime2[MAX_PLAYERS], Timer[MAX_PLAYERS]; //Crie as Vars
public OnPlayerConnect(playerid) {
PTAFKTime2[playerid] = tickcount();
Timer[playerid] = SetTimerEx("PTAFK", 1000, true, "i", playerid); //Iniciei o timer de 1 segundo para o playerid.
}
forward PTAFK(playerid);
public PTAFK(playerid) { //Essa funзгo para ser executado de 1 em 1 segundo.
new Float: PTPos[3]; //Criei um var para as Pos do playerid.
GetPlayerPos(playerid, PTPos[0], PTPos[1], PTPos[2]); //Getei as Pos do playerid.
if(!IsPlayerInRangeOfPoint(playerid, 3.0, PTOldPos[playerid][0], PTOldPos[playerid][1], PTOldPos[playerid][2])) PTAFKTime[playerid] = 0; //Verifico se o playerid nгo estб em um raio de 3 das antigas posiзхes, assim zerando a var.
else PTAFKTime[playerid] += tickcount() - PTAFKTime2[playerid]; //Se ele tiver no raio de 3 das antigas posiзoes, adc o tickcount - o tickcount anterior
PTAFKTime2[playerid] = tickcount(); //Armazeno o tickcount
PTOldPos[playerid][0] = PTPos[0]; //Armazeno a Pos X
PTOldPos[playerid][1] = PTPos[1]; //Armazeno a Pos Y
PTOldPos[playerid][2] = PTPos[2]; //Armazeno a Pos Z
if(PTAFKTime[playerid]/60000 >= 10) { //Verifico se a var divida por 60000(o calculo vai sair em minutos) й maior o igual a 10
SendClientMessage(playerid, 0xFF0000FF, "Kickado por AFK!"); //Mando a msg para o playerid
Kick(playerid); //Kick no playerid por Esc
}
return 1;
}
public OnPlayerDisconnect(playerid, reason) {
KillTimer(Timer[playerid]); //Se o playerid se desconectar destruo o timer para ele nгo ficar rodando enquanto o player estiver off.
return 1;
}
ixi, й mesmo tinha esquecido do ongamemodeinit, colocar no onplayerupdate ou connect como paulor disse.
@paulor, vocк poderia me dizer porque nгo irб dar certo, agradeceria muito *.*. Nгo consigo ver porque nгo iria funcionar D: |
tempo[playerid] = gettime() + (600); //Vc ta armazendo o tempo unix em segundos + 600 segundos que da 10 minutos!
new Float:x,Float:y,Float:z,Float:posicao[3]; //Criou as vars
GetPlayerPos(playerid,x,y,z); //Getou a posiзгo
if(tempo[playerid] <= gettime()) //Aki vc esta verificando Uma coisa que nгo daria certo, pq ? pois a funзгo ela й executa em no maximo 1 milesimo, assim tempo[playerid] nunca vai ser menor sempre maior que gettime!
{