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 quiserCó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; }
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 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; }
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; }
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
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
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 }
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; }
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 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 }
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!Código:
PlayerSpawned [playerid] = 1; // definimos PlayerSpawned para 1! o que significa que ele é gerado!Código:
PlayerSpawned [playerid] = 0; // definimos PlayerSpawned para 0! o que significa que o jogador não é gerado!Código:
PlayerStatsTimer [playerid] = SetTimerEx ("CheckStats", 1000, true, "i", playerid); // vamos fazer um cronômetro chamado CheckStats!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; }
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!
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! } }
Código:
if (CbugWarnings [playerid]> 0) // se o jogador foi avisado pelo menos uma vez ou mais! { CbugWarnings [playerid] = 0; // Definimos como 0! }
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.
Então, OnPlayerConnect colocou:
Código:
PlayerSpam [playerid] = 0; // Definimos o spam do jogador para 0!Código:
PlayerSpam [playerid] = 0; // Definimos o spam do jogador para 0!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); }
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; }
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; }
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! } }
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; }
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!
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 } }
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

0 Comentários