Ad Code

Responsive Advertisement

TUTORIAL COMO CRIAR UM ANTI CHEAT SAMP

 Agora Anti Cheats: -


Hack de arma
-Tentativa de login do Anti RCON
-Anti Spawn Kill
-Anti Jetpack spawn hack

NOVO Em 0.2:
-Anti High Ping
-Anti Packet Loss

Novo Em 0.3:

-Sistema anti CBUG!

Novo no V0.4:

-Anti SPAM!
-Anti ADV!
-Anti HH!

Então vamos começar

primeiro vamos começar com Weapon Hack, Weapon hack é realmente fácil de ser detectado
neste anti cheat que vamos usar onplayerupdate então Onplayerupdate:

primeiro no início do script:
Código:
#define DIALOG_ANTI 10 // aqui nós definimos a caixa de diálogo do Anti cheat como a caixa de diálogo id 10 você pode alterá-la se quiser
Agora, OnPlayerUpdate, precisamos colocar os seguintes códigos: (Explicando nos comentários)
Código:
public OnPlayerUpdate (playerid)
{
	new PlayerWeapon [MAX_PLAYERS]; // aqui criamos uma var chamada PlayerWeapon e faremos esta var para todos os jogadores
	novo nome da arma [32]; // usamos este para detectar o nome da arma a partir do id da arma
	new string [120]; // esta é a string que vamos usar para formatar a mensagem
	new string2 [120]; // esta é a string que vamos usar para formatar a caixa de diálogo
	PlayerWeapon [playerid] = GetPlayerWeapon (playerid); // aqui nós definimos PlayerWeapon [playerid] como GetPlayerWeapon (playerid) então
	// se você fez PlayerWeapon [playerid] == 38 é o mesmo que GetPlayerWeapon (playerid) == 38
	// então você vai se perguntar o que é 38? 38 é minigun, você também pode encontrar todas as outras armas aqui no wiki sa-mp:
	//http://wiki.sa-mp.com/wiki/Weapons este irá mostrar a você cada arma com seu ID
	if (PlayerWeapon [playerid] == 38 || PlayerWeapon [playerid] == 39 || PlayerWeapon [playerid] == 36) // então se a arma do jogador for 38, também conhecida como minigun
	{// ou bolsa ou foguete HS
	GetWeaponName (PlayerWeapon [playerid], gunname, sizeof (gunname)); // aqui está a variável getweaponname eu irei explicá-la agora
	// A sintaxe correta para GetWeaponName é: GetWeaponName (weaponid, const weapon [], len); o primeiro é para o id da arma e o segundo
	// e o segundo é para a corda em que vamos armazenar o nome da arma e a última é do tamanho dessa corda, então vamos chutar o jogador?
	formato (string, sizeof (string), "[ANTI-CHEAT] Jogador:% s ID:% d foi expulso Motivo: Hack de arma || Arma:% s", GetName (playerid), playerid, gunname);
	SendClientMessageToAll (-1, string); // agora vamos enviar a mensagem formatada para todos os jogadores
	// neste: vamos formatar a caixa de diálogo que enviaremos ao jogador banido
	// você pode alterar o [url] www.website.com [/ url] também para seu próprio site :)
	formato (string2, sizeof (string2), "Você foi banido pelo Anti Cheat! \ n Motivo: Hack de arma \ nArma:% s \ nSe você acha que foi banido por engano, visite: \ nwww.website.com", nome da arma);
	ShowPlayerDialog (playerid, DIALOG_ANTI, DIALOG_STYLE_MSGBOX, "Anti Cheat!", String2, "Okay", ""); // vamos mostrar a caixa de diálogo para o jogador
	Ban (playerid); // e vamos banir esse jogador
	}
	return 1;
}
então, se você compilou agora, tenho certeza que terá este erro: símbolo indefinido GetName ou algo parecido,
se você tiver, não se preocupe! significa apenas que você não definiu o estoque GetName, então como você pode se livrar desse erro?
você tem que definir o estoque, então, em qualquer lugar do seu modo de jogo, coloque:
Código:
estoque GetName (playerid)
{
	novo pName22 [68];
    GetPlayerName (playerid, pName22, sizeof (pName22));
    return pName22;
}
então sem erros? isso é bom, agora fizemos nosso hack de armas avançado Anti Cheat! mas com certeza isso não é o suficiente para proteger o servidor,
então após o tutorial de hack de armas, temos que fazer um dos mais importantes anti-cheats de todos os tempos !! vamos criar uma senha anti-rcon errada
Eu sei que não é considerado "cheat", mas é importante,
então neste aqui vamos usar a função onrconloginattempt, então vamos lá!
se você não tem, aqui está:
Código:
public OnRconLoginAttempt (ip [], senha [], sucesso)
{

return 1;
}
então dentro do OnRconLoginAttempt após o {colchete nós precisamos colocar nossas funções principais
esta vai ser fácil e não vai exigir muito
Código:
public OnRconLoginAttempt (ip [], senha [], sucesso)
{
    if (! sucesso) // neste vamos verificar se ele teve sucesso ou não, se não foi, então:
    {
        new PlayerIP [16]; // este é usado para armazenar o ip do jogador
        para (novo i = 0; i <MAX_PLAYERS; i ++) // Loop por todos os jogadores
        {
            GetPlayerIp (i, PlayerIP, sizeof (PlayerIP));
            if (! strcmp (ip, PlayerIP, true)) // se o ip do jogador é o mesmo que PlayerIP, vamos fazê-lo nele
            {
				// você pode alterar o [url] www.website.com [/ url] também para seu próprio site :)
                ShowPlayerDialog (i, DIALOG_ANTI, DIALOG_STYLE_MSGBOX, "Anti Cheat!", "Você foi banido pelo Anti Cheat! \ N Motivo: Login Rcon errado \ nSe você achar que foi banido por engano, visite: \ nwww.website.com", "Ok "," "); // vamos mostrar a caixa de diálogo ao jogador
                Ban (i); // então vamos bani-lo
            }
        }
    }
    return 1;
}
Então, agora nós fizemos 2 anti-cheats, um para anti-weapon hack e o segundo para tentativa errada de rcon.
Mas eu não acho que ambos sejam suficientes para proteger o jogador,
então agora vamos fazer anti-spawn kill!
então vamos usar OnPlayerSpawn neste,
mas primeiro, no topo do seu script:
Código:
new JustSpawned [MAX_PLAYERS]; // detecta se o player acabou de ser gerado ou não
#define SPAWN_TIME 3 // este será o cronômetro que você pode alterar os 3 segundos para qualquer outro tempo que você quiser
agora no playerpawn vamos fazer a nossa função:
Código:
JustSpawned [playerid] = 1; // definimos JustSpawned como 1, o que significa que o jogador acabou de gerar
SetTimerEx ("JSpawned", SPAWN_TIME * 1000,0, "d", playerid); // agora vamos definir um cronômetro para o jogador e vamos fazer 0 loop, o que significa que não será repetido após o tempo está acabado
então agora se você compilou pode dar um aviso de que o JSpawned nunca é usado então vamos definir isso?
Código:
forward JSpawned (playerid); // aqui vamos encaminhar a função JSpawned
public JSpawned (playerid) // e aqui vamos começar a fazer a função principal
{// abre colchetes com certeza
JustSpawned [playerid] = 0; // definimos JustSpawned como 0, o que significa que ele foi gerado há muito tempo
return 1; // vamos usar return 1; para evitar bugs
}
então aqui fizemos a função de temporizador, MAS ainda não terminamos, agora temos que detectar se o jogador está sendo atacado quando ele acabou de
nascer ou não então em playertakedamage:
se você não tem a função, então aqui está:
Código:
public OnPlayerTakeDamage (playerid, issuerid, Float: amount, weaponid)
{
	return 1;
}
agora vamos colocar algo dentro dele, então após OnPlayerTakeDamage após o {colchete, precisamos colocar:
Código:
public OnPlayerTakeDamage (playerid, issuerid, Float: amount, weaponid)
{
	if (JustSpawned [playerid] == 1) // se o jogador acabou de gerar
	{// colchete de abertura
	novo Float: X, Float: Y, Float: Z; // vamos definir X, Y, Z
	GetPlayerPos (issuerid, X, Y, Z); // vamos armazenar o X, Y, Z do id do invasor
	SetPlayerPos (issuerid, X, Y, Z + 3); // vamos definir a posição do id do atacante como Z + 3, o que significa que ele vai colocá-lo no ar
	GameTextForPlayer (issuerid, "Don't Spawn Kill!", 4000,2); // aqui vamos mostrar um gametext para o jogador por 4000 ms que é igual a 4 seg e dizer a ele Don't Spawn Kill!
	} // fechando o colchete
	return 1; // NUNCA SE ESQUEÇA DE USAR return 1;
}
então agora vamos fazer o mais simples que é para jetpack,
então na atualização do jogador temos que colocar isso:
Código:
if (GetPlayerSpecialAction (playerid) == SPECIAL_ACTION_USEJETPACK) // se detectamos que a ação especial do jogador é jetpack, então:
{
new string22 [120]; // vamos definir uma nova string porque vamos armazenar coisas lá
// aqui vamos formatar a string obtendo o nome do jogador e ID e colocando-o lá:
formato (string22, sizeof (string22), "[ANTI - CHEAT] Jogador:% s ID:% d foi banido pelo anti cheat! Razão: Anti Jetpack hack", GetName (playerid), playerid);
SendClientMessageToAll (-1, string22); // então vamos enviar a mensagem para todos no jogo
// você pode alterar o [url] www.website.com [/ url] também para seu próprio site :)
ShowPlayerDialog (playerid, DIALOG_ANTI, DIALOG_STYLE_MSGBOX, "Anti Cheat!", "Você foi banido pelo Anti Cheat! \ NMotivo: Jet Pack \ nSe você acha que foi banido por engano, visite: \ nwww.website.com", "Ok" , ""); // vamos mostrar a caixa de diálogo ao jogador
Ban (playerid); // vamos banir o jogador
}
Agora é hora de fazer Anti High Ping e Anti Packet Loss!

Primeiro, no início do script, temos que definir as coisas MAX permitidas neste servidor, então vamos fazer isso:
Código:
#define MAX_PING 1024 // O ping máximo permitido no servidor! mude o 1024 para qualquer ping máximo que você quiser!
#define MAX_PL 12.0 // A perda máxima de pacotes permitida no servidor! mude 12.0 para qualquer perda máxima de pacotes que você quiser!
#define MAX_PINGWARN 5 // O Máximo avisa para o jogador antes de chutá-lo por um ping alto! mude se quiser!
#define MAX_PLWARN 5 // O Máximo avisa para o jogador antes de chutá-lo por um ping alto! mude se quiser!
new PlayerPingWarns [MAX_PLAYERS]; // As vezes que aquele jogador foi avisado por Ping alto!
new PlayerPLWarns [MAX_PLAYERS]; // As vezes que aquele jogador foi avisado por High PacketLoss!
new PlayerStatsTimer [MAX_PLAYERS]; // O cronômetro define!

Agora vamos fazer um cronômetro para ver o jogador ping e perder pacotes, mas primeiro precisamos ter certeza se o jogador
foi gerado ou não! então, no topo do script:
Código:
new PlayerSpawned [MAX_PLAYERS] = {0}; // definimos playerspawned como 0 por padrão!
agora OnPlayerSpawn
Código:
PlayerSpawned [playerid] = 1; // definimos PlayerSpawned para 1! o que significa que ele é gerado!
agora OnPlayerDeath
Código:
PlayerSpawned [playerid] = 0; // definimos PlayerSpawned para 0! o que significa que o jogador não é gerado!
Agora OnPlayerSpawn Novamente precisamos adicionar o Timer que fará toda a função!
Código:
PlayerStatsTimer [playerid] = SetTimerEx ("CheckStats", 1000, true, "i", playerid); // vamos fazer um cronômetro chamado CheckStats!
então, depois de criarmos o cronômetro, precisamos adicionar algumas funções para que nosso código funcione bem!
Vamos adicionar o estoque de perda de pacotes do jogador get! em qualquer lugar em seu gm [precisa estar após o inclui, não antes dele] adicione:
Código:
estoque Float: GetPlayerPacketLoss (playerid) // o estoque
{
        new stats [401], stringstats [70]; // essas são as variáveis ​​de que precisaremos no estoque
        GetPlayerNetworkStats (playerid, stats, sizeof (stats)); // este irá obter as estatísticas líquidas
        new len = strfind (stats, "Packetloss:"); // e este vai obter a perda de pacotes
        novo flutuador: perda de pacote = 0,0; // o flutuador para perda de pacote
        if (len! = -1)
        {
                strmid (stringstats, estatísticas, len, strlen (estatísticas));
                novo len2 = strfind (stringstats, "%");
                if (len! = -1)
                {
                        strdel (estatísticas, 0, strlen (estatísticas));
                        strmid (estatísticas, stringstats, len2-3, len2);
                        packetloss = floatstr (estatísticas);
                }
        }
        return packetloss;
}
Então agora vamos fazer nossa função de cronômetro!
Código:
encaminhar CheckStats (playerid); // encaminhar a função!
public CheckStats (playerid) // agora vamos usar public!
{// abrimos o colchete para CheckStats
new string [120]; // fazemos uma string!
new string2 [120]; // fazemos uma segunda string!
if (GetPlayerPing (playerid)> = MAX_PING && PlayerPingWarns [playerid] <MAX_PINGWARN) // Se o ping do jogador for maior ou igual ao ping máximo e o jogador avisar que não é igual ao máximo avisa!
{
PlayerPingWarns [playerid] ++; // aumentamos os avisos!
format (string, sizeof (string), "Aviso! Ping alto! [% d /% d]", PlayerPingWarns [playerid], MAX_PINGWARN); // Avisamos o jogador que seu ping está alto!
SendClientMessage (playerid, -1, string); // então enviamos!
}
else if (GetPlayerPing (playerid)> = MAX_PING && PlayerPingWarns [playerid] == MAX_PINGWARN) // se o ping do jogador é maior que o ping máximo e o ping do jogador avisa é = ao máximo avisa
{
PlayerPingWarns [playerid] = 0; // definimos como 0!
format (string, sizeof (string), "Aviso! Ping alto! [% d /% d]", PlayerPingWarns [playerid], MAX_PINGWARN); // Avisamos o jogador que seu ping está alto!
SendClientMessage (playerid, -1, string); // então enviamos!
format (string2, sizeof (string2), "Você Foi Expulso pelo Anti Cheat! \ nReason: High Ping!"); // vamos formatar a caixa de diálogo!
ShowPlayerDialog (playerid, DIALOG_ANTI, DIALOG_STYLE_MSGBOX, "Anti Cheat!", String2, "Okay", ""); // vamos mostrar a caixa de diálogo para o jogador
Chute (playerid); // finalmente o chutamos!
}

if (GetPlayerPacketLoss (playerid)> = MAX_PL && PlayerPLWarns [playerid] <MAX_PLWARN) // Se o jogador Packetloss é maior ou igual ao máximo packetloss e o jogador avisa não é igual ao máximo avisa!
{
PlayerPLWarns [playerid] ++; // aumentamos os avisos!
format (string, sizeof (string), "Aviso! High PacketLoss! [% d /% d]", PlayerPingWarns [playerid], MAX_PLWARN); // Avisamos o jogador que seu Packetloss está alto!
SendClientMessage (playerid, -1, string); // então enviamos!
}
else if (GetPlayerPing (playerid)> = MAX_PL && PlayerPLWarns [playerid] == MAX_PLWARN) // se o ping do jogador for maior que o ping máximo e o player Packetloss avisa é = to the max avisa
{
PlayerPLWarns [playerid] = 0; // nós o definimos como 0!
format (string, sizeof (string), "Aviso! Perda de pacotes alta! [% d /% d]", PlayerPLWarns [playerid], MAX_PLWARN); // Avisamos ao jogador que a perda de pacotes está alta!
SendClientMessage (playerid, -1, string); // então enviamos!
format (string2, sizeof (string2), "Você foi expulso pelo anti cheat! \ nReason: Packetloss alto!"); // vamos formatar o diálogo!
ShowPlayerDialog (playerid, DIALOG_ANTI, DIALOG_STYLE_MSGBOX, "Anti Cheat!", String2, "Okay", ""); // vamos mostrar a caixa de diálogo para o jogador
Chute (playerid); // finalmente o chutamos!
}
return 1; // usamos return 1 para evitar bugs
} // fechamos o colchete Chectstats! significa que terminamos!

então esse sistema CBUG vai ser fácil! pois vamos precisar de uma função! então, no topo do modo de jogo, coloque:
[certifique-se de que é depois de incluir]:
Código:
new CbugWarnings [MAX_PLAYERS]; // criamos este para obter o tempo dos avisos do jogador!
#define MAX_CBUGWARNINGS 10 // o jogador será avisado 10 vezes e depois será chutado!
agora OnPlayerStateChange, precisamos colocar:
Código:
 if ((oldkeys & KEY_FIRE) && (newkeys & KEY_CROUCH)) // se o jogador usou o fogo então Crouch depois disso!
 {
 if (CbugWarnings [playerid] <MAX_CBUGWARNINGS) // se os avisos de cbug forem menores que o máximo de avisos!
 {
 CbugWarnings [playerid] ++; // aumentamos o cbug avisa do jogador!
 new string [120]; // definimos uma string chamada string!
 format (string, sizeof (string), "Aviso! Não Cbug [% d /% d]", CbugWarnings [playerid], MAX_CBUGWARNINGS); // formatamos a string e avisamos o jogador!
 SendClientMessage (playerid, -1, string); // então enviamos essa mensagem!
 }
 else if (CbugWarnings [playerid]> = MAX_CBUGWARNINGS)
 {
 CbugWarnings [playerid] = 0; // definimos Cbugwarninsg como 0!
 new string [120]; // definimos uma string chamada string!
 new string2 [120]; /// definimos uma outra string chamada string2!
 format (string, sizeof (string), "[ANTI-CHEAT] Jogador:% s ID:% d Foi expulso Motivo: CBUG", GetName (playerid), playerid); // Formamos a string e informamos aos jogadores que tem jogador que foi chutado por CBUG!
 SendClientMessageToAll (-1, string); // Em seguida, enviamos para todos!
 format (string2, sizeof (string2), "Você foi expulso pelo anti cheat! \ nRazão: CBUG"); // formatamos o diálogo!
 ShowPlayerDialog (playerid, DIALOG_ANTI, DIALOG_STYLE_MSGBOX, "Anti Cheat!", String2, "Okay", ""); // vamos mostrar a caixa de diálogo para o jogador
 Kick (playerid); // ENTÃO nós chutamos aquele jogador!
 }
 }
E daí se o jogador foi desconectado, mas ele teve avisos de CBUG? então OnPlayerDisconnect:
Código:
if (CbugWarnings [playerid]> 0) // se o jogador foi avisado pelo menos uma vez ou mais!
{
CbugWarnings [playerid] = 0; // Definimos como 0!
}
Ok, então vamos fazer um ANTI SPAM!
Portanto, o anti-spam é útil se não houver um administrador online.
Eu cheguei a um servidor uma vez [não quero dizer o nome] e todo mundo estava
fazendo spam E eu odiei então hoje eu decidi fazer a próxima versão para anti cheat! Tudo bem, então,
no início do script:

Código:
#define MAX_SPAM 3 // O MAX spam permitido para o jogador.
#define MAX_DECREASECOUNT 5 // Diminuir a contagem significa diminuir o spam do jogador e 5 é = 5 segundos
novo PlayerSpam [MAX_PLAYERS]; // Os horários em que o jogador enviou spam.
novo SpamTimer [MAX_PLAYERS]; // O cronômetro que vamos usar para diminuir a contagem.
Ok Bom, agora OnPlayerConnect, precisamos definir o PlayerSpam para 0, certo?
Então, OnPlayerConnect colocou:
Código:
PlayerSpam [playerid] = 0; // Definimos o spam do jogador para 0!
E OnPlayerDisconnect:
Código:
PlayerSpam [playerid] = 0; // Definimos o spam do jogador para 0!
Agora OnPlayerText:
Código:
SpamTimer [playerid] = SetTimerEx ("DecreaseSpam", MAX_DECREASECOUNT * 1000,1, "d", playerid)
if (PlayerSpam [playerid] <MAX_SPAM) // Se o playerpam for menor que max_spam
{
 PlayerSpam [playerid] ++;
}
else if (PlayerSpam [playerid]> = MAX_SPAM) // Se o spam do jogador for maior ou igual ao máximo de spam permitido!
{
novo TalkString [120], string [120];
// NÓS FORMAMOS A CADEIA
formato (string, sizeof (string), "[ANTI-CHEAT] Jogador:% s ID:% d Foi expulso Motivo: SPAM", GetName (playerid), playerid);
// ENTÃO ENVIAMOS PARA TODOS!
SendClientMessageToAll (-1, string);
formato (TalkString, sizeof (TalkString), "Você Foi Expulso pelo Anti Cheat! \ nReason: SPAM");
// vamos mostrar a caixa de diálogo ao jogador
ShowPlayerDialog (playerid, DIALOG_ANTI, DIALOG_STYLE_MSGBOX, "Anti Cheat!", TalkString, "Ok", "");
// definimos o playerpam para 0 para que ele não se misture com outros jogadores quando eles se conectarem!
PlayerSpam [playerid] = 0;
// matamos o cronômetro!
KillTimer (SpamTimer [playerid]);
// Então chutamos o jogador!
Chute (playerid);
}
tão bom! agora fizemos o principal no OnPlayerText! agora vamos fazer o Timer!
então, em qualquer lugar em seu gm, mas após o #Include não antes dele:
Código:
// encaminhamos o temporizador DecreaseSpam!
encaminhar DecreaseSpam (playerid);
// então usamos public para fazer a função principal nele!
public DecreaseSpam (playerid)
{
// diminuímos o PlayerSpam em 1!
PlayerSpam [playerid] -;
// Então retornamos 1!
return 1;
}
então agora fizemos a função principal e está tudo pronto!
Agora é hora de fazer uma função mais fácil é anti adv! agora primeiro precisamos colocar um estoque
que define se o jogador tem adv ou não! então, em qualquer lugar em seu GM, mas certifique-se de que seja após o inclui, não antes dele:

Código:
estoque CheckAdv (palavra [])
{
    se (strlen (palavra)> 22) retornar 0;
    if (strfind (palavra, ".", verdadeiro) == - 1) retornar 0;

    novo ip [5] [256], índice;
    ip [0] = strtok (palavra, índice, '.');
    ip [1] = strtok (palavra, índice, '.');
    ip [2] = strtok (palavra, índice, '.');
    if (strfind (word, ":", true)> 0) {
        ip [3] = strtok (palavra, índice, ':');
        if (strfind (palavra, ",", verdadeiro)> 0) ip [4] = strtok (palavra, índice, ','); else ip [4] = strtok (palavra, índice);
    } senão {
        if (strfind (palavra, ",", verdadeiro) == strlen (palavra)) ip [3] = strtok (palavra, índice, ','); else ip [3] = strtok (palavra, índice);
        valstr (ip [4], 0);
    }
    if (! IsNumeric (ip [0]) ||! IsNumeric (ip [1]) ||! IsNumeric (ip [2]) ||! IsNumeric (ip [3]) ||! IsNumeric (ip [4])
        ||! strlen (ip [0]) ||! strlen (ip [1]) ||! strlen (ip [2]) ||! strlen (ip [3]) ||! strlen (ip [4])
        || (strval (ip [0]) == 192 && strval (ip [1]) == 168)
        || (strval (ip [0]) == 172 && strval (ip [1])> = 16 && strval (ip [1]) <= 31)
        || strval (ip [0]) == 10 || (strval (ip [0]) == 127 && strval (ip [1]) == 0 && strval (ip [2]) == 0 && strval (ip [3]) = = 1)) retorno 0;
    return 1;
}
agora OnPlayerText:
Código:
    nova palavra [150], Índice; enquanto (Índice <strlen (texto)) {
        palavra = strtok (texto, índice);
        if (CheckAdv (word) == 1) {// Se houver uma palavra das palavras no estoque CheckAdv!
			// Se o texto do player continha. e números!
            novo i = strfind (texto, palavra), j = i + strlen (palavra) -1; texto [i ++] = '[';
            enquanto (i <j) {texto [i] = '•'; i ++;}
            texto [j] = ']';
            Kick (playerid); // Este vai chutar o jogador com certeza!
            nova string2 [128]; // FAZEMOS uma string chamada string2
            // Primeiro nós formatamos!
            formato (string2, sizeof (string2), "[ANTI-CHEAT] Jogador:% s ID:% d Foi expulso Motivo: SPAM", GetName (playerid), playerid);
            SendClientMessageToAll (-1, string2); // enviamos então!

        }
    }
agora vamos definir strtok e numeric:
em qualquer lugar em seu GM:
Código:
stock strtok (const string [], & index, seperator = '')
{
        novo comprimento = strlen (string);
        novo deslocamento = índice;
        novo resultado [128];
        while ((índice <comprimento) && (string [índice]! = separador) && ((índice - deslocamento) <(sizeof (resultado) - 1)))
        {
                resultado [índice - deslocamento] = string [índice];
                index ++;
        }

        resultado [índice - deslocamento] = EOS;
        if ((índice <comprimento) && (string [índice] == separador))
        {
                index ++;
        }
        resultado de retorno;
}
Código:
IsNumeric (const string [])
{
    para (novo i = 0, j = strlen (string); i <j; i ++)
    {
        if (string [i]> '9' || string [i] <'0') retorna 0;
    }
    return 1;
}
Tudo bem então! agora fizemos anti ADV e anti SPAM! agora é hora de nos levarmos a um hack importante!
HH! HH significa Health Hack e é um dos hacks importantes que todo servidor tem para proteger os jogadores dele!
Tudo bem, então. Neste ponto, usaremos OnPlayerTakeDamage!
mas primeiro no início do script:
Código:
new GotHit [MAX_PLAYERS]; // as vezes que o jogador foi atingido pela jogada!
novo Float: OldHealth [MAX_PLAYERS]; // este irá detectar o OldHealth do jogador!
new Float: NewHealth [MAX_PLAYERS]; // Este irá detectar a nova Saúde do jogador!
#define DETECT_AFTER 6 // POR FAVOR NÃO MODIFIQUE OU PODE PROIBIR JOGADORES INOCENTES!
Tudo bem, então agora OnPlayerTakeDamage Precisamos colocar:
Código:
GotHit [playerid] ++; // aumentamos o tempo que o jogador obteve HIT!
if (GotHit [playerid]> = 3 && GotHit [playerid] <6) // SE O JOGADOR TIVER SAÚDE 3 VEZES OU MAIS, MAS MENOS DE 6!
{
GetPlayerHealth (playerid, OldHealth [playerid]); // GANHAMOS A SAÚDE DO JOGADOR!
}
if (GotHit [playerid]> = DETECT_AFTER) // SE O JOGADOR TIVER SUCESSO POR 6 VEZES OU MAIS!
{
GetPlayerHealth (playerid, NewHealth [playerid]);
if (OldHealth [playerid] == NewHealth [playerid]) // SE O JOGADOR ANTIGO SAÚDE É O MESMO QUE O NOVO!
{
new string22 [120]; // vamos definir uma nova string porque vamos armazenar coisas lá
// aqui vamos formatar a string obtendo o nome do jogador e ID e colocando-o lá:
formato (string22, sizeof (string22), "[ANTI - CHEAT] Jogador:% s ID:% d foi expulso pelo anti cheat! Razão: HH!", GetName (playerid), playerid);
SendClientMessageToAll (-1, string22); // então vamos enviar a mensagem para todos no jogo
ShowPlayerDialog (playerid, DIALOG_ANTI, DIALOG_STYLE_MSGBOX, "Anti Cheat!", "Você foi chutado pelo Anti Cheat! \ NReason: Health Hack!", "Okay", ""); // vamos mostrar o diálogo para o jogador
Kick (playerid); // vamos chutar o jogador
}
}
Parabéns! Você fez seu próprio Anti HH, Anti SPAM e Anti ADV! Agora os jogadores podem jogar pelo seguro!
Sem se preocupar se não há admins online, continue seguindo o tutorial para mais anti hacks!
Entrada: hack de munição, hack de arma, pausa aérea!
Entrada [Não é necessário adicioná-lo]: salvando logs! [vai salvar os logs quando um jogador for chutado ou banido pelo anti cheat e colocá-lo em um arquivo!]
Então eu acho que é o suficiente por agora para proteger o jogador, atualizarei este tutorial em breve e explicarei mais em breve

Postar um comentário

0 Comentários

© 2022 PawnScript All Rights Reversed