[Include] Anti-Weapon/Ammo Hack
#1

Anti-Weapon/Ammo Hack + Funзхes
Depois de um bom tempo sem release, resolvi desenvolver este anti-cheat, pois como estou com um projeto em mente esta include farб parte do mesmo.
As nomenclaturas falam por si sу...

Stock:

Код:
ACW_GivePlayerWeapon(playerid, weaponid, ammo)
Parвmetros:
playerid = ID do jogador
weaponid = ID da arma
ammo = Quantia de muniзгo
__________________________________________________ _______________________________
Код:
ACW_SetPlayerWeaponAmmo(playerid, weaponid, ammo)
Parвmetros:
playerid = ID do jogador
weaponid = ID da arma
ammo = Quantia de muniзгo
__________________________________________________ _______________________________
Код:
ACW_RemovePlayerWeapon(playerid, weaponid)
Parвmetros:
playerid = ID do jogador
weaponid = ID da arma
__________________________________________________ _______________________________
Код:
ACW_ResetPlayerWeapons(playerid)
Parвmetros:
playerid = ID do jogador
__________________________________________________ _______________________________

Callback:

Код:
OnPlayerWeaponHackDetected(playerid, detectionid, weaponid, ammo)
* Chamada quando uma arma e/ou muniзгo nгo estб registrada para o jogador.

Parвmetros:
playerid = ID do jogador
detectionid = ID da detecзгo (1 = weapon hack | 2 = ammo hack)
weaponid = ID da arma
ammo = Quantia de muniзгo
__________________________________________________ _______________________________
Macro:
Код:
#define WEAPON_HACK_CHECK_TIME              (3) // Segundos
* Tempo de verificaзгo (em segundos)



Bugs:
Код:
[@RodrigoMSR]
* Ao ganhar a bomba remota, automaticamente ganha o detonador e faz uma falsa detecзгo: (corrigido)
   - Bomba remota (WEAPON_SATCHEL - ID 39)
   - Detonador (WEAPON_BOMB- ID 40)

[@RodrigoMSR]
* Ao alcanзar uma certa altura atravйs de um veнculo aйreo, automaticamente ganha um paraquedas e faz falsa detecзгo: (corrigido)
   - Paraquedas (WEAPON_PARACHUTE - ID 46)

Download: (Atualizado - 20/07/2017)
acweapon.inc
acweapon.inc (Hook)

OBS:
Caso queiram usar as funзхes nativas GivePlayerWeapon e ResetPlayerWeapons, baixem a versгo com hook.


Crйditos:
a_samp by SAMP Team
foreach by ******
acweapon by F1N4L
Reply
#2

Irei testar
Reply
#3

SetTimer + Loop em determinadas situaзхes prejudica o intervalo do servidor, pois verifica tudo junto, indisponibilizando de verificar аs demais coisas. O ideal para contagens de pouco perнodo й uso de SetTimerEx ou OnPlayerUpdate que seria melhor ainda, exemplo:
PHP код:
public OnPlayerUpdate(playerid)
{
    static 
time;
    
time gettime();
    if(
GetPVarInt(playerid"VerificarACtime") < time)//Intervalo de 1 seg
    
{
        
SetPVarInt(playerid"VerificarACtime"time);
        
ChecarAntiXiter(playerid);
    }

Mesmo que seja processado inъmeros if's na OnPlayerUpdate ou 500 settimerex, й mais otimizado do que Apenas 1 SetTimer global e um LOOP. Isso jб foi discutido no fуrum, atй o ****** comentou sobre isso.

SetTimer + Loop й vantajoso para verificaзхes longas como por exemplo 30 em 30 segundos chegar algo, dentre outas formas ..

Seu AC estб bom, porйm, dar para simplificar mais.
Reply
#4

Quote:
Originally Posted by XandyMello
Посмотреть сообщение
SetTimer + Loop em determinadas situaзхes prejudica o intervalo do servidor, pois verifica tudo junto, indisponibilizando de verificar аs demais coisas. O ideal para contagens de pouco perнodo й uso de SetTimerEx ou OnPlayerUpdate que seria melhor ainda, exemplo:
PHP код:
public OnPlayerUpdate(playerid)
{
    static 
time;
    
time gettime();
    if(
GetPVarInt(playerid"VerificarACtime") < time)//Intervalo de 1 seg
    
{
        
SetPVarInt(playerid"VerificarACtime"time);
        
ChecarAntiXiter(playerid);
    }

Mesmo que seja processado inъmeros if's na OnPlayerUpdate ou 500 settimerex, й mais otimizado do que Apenas 1 SetTimer global e um LOOP. Isso jб foi discutido no fуrum, atй o ****** comentou sobre isso.

SetTimer + Loop й vantajoso para verificaзхes longas como por exemplo 30 em 30 segundos chegar algo, dentre outas formas ..

Seu AC estб bom, porйm, dar para simplificar mais.
Nгo tinha conhecimento sobre essa otimizaзгo.
Farei as devidas alteraзхes, obrigado!
Reply
#5

Quote:
Originally Posted by XandyMello
Посмотреть сообщение
SetTimer + Loop em determinadas situaзхes prejudica o intervalo do servidor, pois verifica tudo junto, indisponibilizando de verificar аs demais coisas. O ideal para contagens de pouco perнodo й uso de SetTimerEx ou OnPlayerUpdate que seria melhor ainda, exemplo:
..
Mesmo que seja processado inъmeros if's na OnPlayerUpdate ou 500 settimerex, й mais otimizado do que Apenas 1 SetTimer global e um LOOP. Isso jб foi discutido no fуrum, atй o ****** comentou sobre isso.

SetTimer + Loop й vantajoso para verificaзхes longas como por exemplo 30 em 30 segundos chegar algo, dentre outas formas ..

Seu AC estб bom, porйm, dar para simplificar mais.
Agora fiquei curioso
Em base de que afirma isto ?
cade a fonte que confirma isto ??
Reply
#6

Quote:
Originally Posted by XandyMello
Посмотреть сообщение
SetTimer + Loop em determinadas situaзхes prejudica o intervalo do servidor, pois verifica tudo junto, indisponibilizando de verificar аs demais coisas. O ideal para contagens de pouco perнodo й uso de SetTimerEx ou OnPlayerUpdate que seria melhor ainda, exemplo:
PHP код:
public OnPlayerUpdate(playerid)
{
    static 
time;
    
time gettime();
    if(
GetPVarInt(playerid"VerificarACtime") < time)//Intervalo de 1 seg
    
{
        
SetPVarInt(playerid"VerificarACtime"time);
        
ChecarAntiXiter(playerid);
    }

Mesmo que seja processado inъmeros if's na OnPlayerUpdate ou 500 settimerex, й mais otimizado do que Apenas 1 SetTimer global e um LOOP. Isso jб foi discutido no fуrum, atй o ****** comentou sobre isso.

SetTimer + Loop й vantajoso para verificaзхes longas como por exemplo 30 em 30 segundos chegar algo, dentre outas formas ..

Seu AC estб bom, porйm, dar para simplificar mais.
Abro sу um parenteses pelo uso da sua static, que irб gerar conflito. Por ser uma variбvel local indestrutнvel, cada chamada de OnPlayerUpdate a um jogador, irб fazer a manipulaзгo dessa static, e enquanto ela estiver sendo manipulada nessa chama, quando houver outra chamada de outro jogador, farб tambйm essa manipulaзгo e assim alterarб o valor no momento de execuзгo, alterando tambйm na outra chamada.

Pra ter uma ideia mais na prбtica, basta seguir esse cуdigo:
PHP код:
public OnPlayerUpdate(playerid)
{
    static 
id;
    new 
string[2];
    
id playerid;
    
format(stringsizeof(string), "%d: %d"playeridid);
    
SendClientMessage(playerid, -1string);
    
//A mensagem deveria ser "id do jogador: id do jogador", mas serб diferente, dado por outra chamada de OnPlayerUpdate de outro jogador alterar o valor da static id.
    
return 1;

O correto seria indexar essa static com MAX_PLAYERS.
Reply
#7

Quote:
Originally Posted by F1N4L
View Post
Nгo havia realizado testes na ammu ainda, entгo sim, haverб detecзгo de cheat.

Pense desta forma:
Considerando que eu crie uma exceзгo para a ammu, seria uma brecha para um cheater. Isso porque nгo consigo ver uma forma segura de abrir essa exceзгo!
Se eu liberar a compra de armas/muniзгo na ammu, o hacker poderia usar um cheat e abusar disso...

Sobre pickup:
As pickups quem cria й o desenvolvedor do script, logo, quando usado a funзгo da include (ACW_GivePlayerWeapon) nгo haverб detecзгo...

De forma resumida sobre ammunation:
A menos que eu nгo encontre uma forma segura para criar uma exceзгo para ammu, nгo irei fazer.
entгo as pickups que seta arma se o cara pegar n vai ser ban mas as ammu sim ? e teria um jeito de excluir aqueles checkpoins ?
Reply
#8

Quote:
Originally Posted by Bruno13
Посмотреть сообщение
Abro sу um parenteses pelo uso da sua static, que irб gerar conflito. Por ser uma variбvel local indestrutнvel, cada chamada de OnPlayerUpdate a um jogador, irб fazer a manipulaзгo dessa static, e enquanto ela estiver sendo manipulada nessa chama, quando houver outra chamada de outro jogador, farб tambйm essa manipulaзгo e assim alterarб o valor no momento de execuзгo, alterando tambйm na outra chamada.

Pra ter uma ideia mais na prбtica, basta seguir esse cуdigo:
PHP код:
public OnPlayerUpdate(playerid)
{
    static 
id;
    new 
string[2];
    
id playerid;
    
format(stringsizeof(string), "%d: %d"playeridid);
    
SendClientMessage(playerid, -1string);
    
//A mensagem deveria ser "id do jogador: id do jogador", mas serб diferente, dado por outra chamada de OnPlayerUpdate de outro jogador alterar o valor da static id.
    
return 1;

O correto seria indexar essa static com MAX_PLAYERS.
SA:MP й single-threaded, nгo tem como isso acontecer.
Na verdade o ideal nem й usar static aн dentro, mas sim fora:
PHP код:
static acwTime[MAX_PLAYERS];
public 
OnPlayerUpdate(playerid

    new 
timeNow gettime();
    if((
timeNow acwTime[playerid]) > WEAPON_HACK_CHECK_TIME)
    { 
        
acwTime[playerid] = timeNow;
        
ChecarAntiXiter(playerid); 
    } 

Reply
#9

Quote:
Originally Posted by Bruno13
Посмотреть сообщение
Abro sу um parenteses pelo uso da sua static, que irб gerar conflito. Por ser uma variбvel local indestrutнvel, cada chamada de OnPlayerUpdate a um jogador, irб fazer a manipulaзгo dessa static, e enquanto ela estiver sendo manipulada nessa chama, quando houver outra chamada de outro jogador, farб tambйm essa manipulaзгo e assim alterarб o valor no momento de execuзгo, alterando tambйm na outra chamada.

Pra ter uma ideia mais na prбtica, basta seguir esse cуdigo:
PHP код:
public OnPlayerUpdate(playerid)
{
    static 
id;
    new 
string[2];
    
id playerid;
    
format(stringsizeof(string), "%d: %d"playeridid);
    
SendClientMessage(playerid, -1string);
    
//A mensagem deveria ser "id do jogador: id do jogador", mas serб diferente, dado por outra chamada de OnPlayerUpdate de outro jogador alterar o valor da static id.
    
return 1;

O correto seria indexar essa static com MAX_PLAYERS.
Viajou em Bruno, kkkk.

A funзгo do 'gettime' й obter o tempo do servidor, ou seja, o tempo й global, nгo precisa ser obtido para cada player, necessita sim setar o tempo obtido em uma variбvel "playerid", contudo, serб verificado 1 em 1 segundos o AC para cada player. Acredito que vocк confundiu o gettickcount com gettime '-'
De uma olhada nesse tуpico, vк o post do Yashas, depois vai no link que ele sugeriu, vai ver que ele usa dessa forma. https://sampforum.blast.hk/showthread.php?tid=575349&page=2


F1NAL, acho melhor vocк usar da forma que dei como exemplo:
PHP код:
new VerificarAC[MAX_PLAYERS];
public 
OnPlayerUpdate(playerid)
{
    static 
time;
    
time gettime();
    if(
VerificarAC[playerid] < time)//Intervalo de 1 seg
    
{
        
VerificarAC[playerid] = time;
        
AntiXiter(playerid);
    }
    return 
1;

Й mais vantajoso, pois em vez do processo de contagens no servidor(SetTimerEx) para verificar, serб o processo de 'if's na onplayerupdate bloqueando que seja chamado + de 1 vez por segundo. Alйm disso, й vantajoso quando o jogador estб de ESC, pois o OnPlayerUpdate nгo serб chamado. Pode analisar os AC's postado no fуrum, todos usam na OnPlayerUpdate por essas vantagens citada acima. Pode ficar tranquilo que IF na OnPlayerUpdate nгo dar lag, isso й um MITO(A menos que encha).

O uso de SetTimerEx ou OnPlayerUpdate й muito melhor que SetTimer + Loop por que nunca serб verificado tudo
de uma vez, contudo nгo prejudicarб o intervalo do servidor. De uma olhada, achei um tуpico discutindo isso:
https://sampforum.blast.hk/showthread.php?tid=575349&page=2

@renatog
static: dentro ou fora dб no mesmo, static й como uma variбvel global se colocada no local, usando static evitarб que seja criada e destruida inъmeras vezes a mesma variбvel, pois como sabemos, а OnPlayerUpdate й chamada varias vezes por segundos para cada player, exceto se o mesmo estiver de ESC. Ou seja, sempre que possнvel use static em vez de new na OnPlayerUpdate. VIAJOU TAMBЙM HAHAHA
Reply
#10

Quote:
Originally Posted by GuilhermeNunes
Посмотреть сообщение
entгo as pickups que seta arma se o cara pegar n vai ser ban mas as ammu sim ? e teria um jeito de excluir aqueles checkpoins ?
Exato, pickups sу vгo detectar se vocк usar a funзгo nativa do SAMP. Usando da include nгo haverб bugs...

Checkpoints e actors podem ser desativados usando este pequeno script: https://sampforum.blast.hk/showthread.php?tid=544953
Testei e realmente funciona.


Quote:
Originally Posted by XandyMello
Посмотреть сообщение
Viajou em Bruno, kkkk.

A funзгo do 'gettime' й obter o tempo do servidor, ou seja, o tempo й global, nгo precisa ser obtido para cada player, necessita sim setar o tempo obtido em uma variбvel "playerid", contudo, serб verificado 1 em 1 segundos o AC para cada player. Acredito que vocк confundiu o gettickcount com gettime '-'
De uma olhada nesse tуpico, vк o post do Yashas, depois vai no link que ele sugeriu, vai ver que ele usa dessa forma. https://sampforum.blast.hk/showthread.php?tid=575349&page=2


F1NAL, acho melhor vocк usar da forma que dei como exemplo:
PHP код:
new VerificarAC[MAX_PLAYERS];
public 
OnPlayerUpdate(playerid)
{
    static 
time;
    
time gettime();
    if(
VerificarAC[playerid] < time)//Intervalo de 1 seg
    
{
        
VerificarAC[playerid] = time;
        
AntiXiter(playerid);
    }
    return 
1;

Й mais vantajoso, pois em vez do processo de contagens no servidor(SetTimerEx) para verificar, serб o processo de 'if's na onplayerupdate bloqueando que seja chamado + de 1 vez por segundo. Alйm disso, й vantajoso quando o jogador estб de ESC, pois o OnPlayerUpdate nгo serб chamado. Pode analisar os AC's postado no fуrum, todos usam na OnPlayerUpdate por essas vantagens citada acima. Pode ficar tranquilo que IF na OnPlayerUpdate nгo dar lag, isso й um MITO(A menos que encha).

O uso de SetTimerEx ou OnPlayerUpdate й muito melhor que SetTimer + Loop por que nunca serб verificado tudo
de uma vez, contudo nгo prejudicarб o intervalo do servidor. De uma olhada, achei um tуpico discutindo isso:
https://sampforum.blast.hk/showthread.php?tid=575349&page=2
Agora vi veracidade nesse argumento!
Eu sempre acreditei nesse "mito" do OnPlayerUpdate. Bom saber que й sу um mito haha ><
Reply
#11

Quote:
Originally Posted by renatog
Посмотреть сообщение
SA:MP й single-threaded, nгo tem como isso acontecer.
Na verdade o ideal nem й usar static aн dentro, mas sim fora:
PHP код:
static acwTime[MAX_PLAYERS];
public 
OnPlayerUpdate(playerid

    new 
timeNow gettime();
    if((
timeNow acwTime[playerid]) > WEAPON_HACK_CHECK_TIME)
    { 
        
acwTime[playerid] = timeNow;
        
ChecarAntiXiter(playerid); 
    } 

O que tem a ver ser single-thread? Nada. O que coloquei em pauta й que, se criares uma variбvel estбtica em OnPlayerUpdate que precise armazenar um valor diferente para cada jogador, ocorrerб conflitos e isso й inegбvel. Pegue meu cуdigo, compile e teste por si mesmo!

Quote:
Originally Posted by XandyMello
Посмотреть сообщение
Viajou em Bruno, kkkk.

A funзгo do 'gettime' й obter o tempo do servidor, ou seja, o tempo й global, nгo precisa ser obtido para cada player, necessita sim setar o tempo obtido em uma variбvel "playerid", contudo, serб verificado 1 em 1 segundos o AC para cada player. Acredito que vocк confundiu o gettickcount com gettime '-'
De uma olhada nesse tуpico, vк o post do Yashas, depois vai no link que ele sugeriu, vai ver que ele usa dessa forma. https://sampforum.blast.hk/showthread.php?tid=575349&page=2


F1NAL, acho melhor vocк usar da forma que dei como exemplo:
PHP код:
new VerificarAC[MAX_PLAYERS];
public 
OnPlayerUpdate(playerid)
{
    static 
time;
    
time gettime();
    if(
VerificarAC[playerid] < time)//Intervalo de 1 seg
    
{
        
VerificarAC[playerid] = time;
        
AntiXiter(playerid);
    }
    return 
1;

Й mais vantajoso, pois em vez do processo de contagens no servidor(SetTimerEx) para verificar, serб o processo de 'if's na onplayerupdate bloqueando que seja chamado + de 1 vez por segundo. Alйm disso, й vantajoso quando o jogador estб de ESC, pois o OnPlayerUpdate nгo serб chamado. Pode analisar os AC's postado no fуrum, todos usam na OnPlayerUpdate por essas vantagens citada acima. Pode ficar tranquilo que IF na OnPlayerUpdate nгo dar lag, isso й um MITO(A menos que encha).

O uso de SetTimerEx ou OnPlayerUpdate й muito melhor que SetTimer + Loop por que nunca serб verificado tudo
de uma vez, contudo nгo prejudicarб o intervalo do servidor. De uma olhada, achei um tуpico discutindo isso:
https://sampforum.blast.hk/showthread.php?tid=575349&page=2

@renatog
static: dentro ou fora dб no mesmo, static й como uma variбvel global se colocada no local, usando static evitarб que seja criada e destruida inъmeras vezes a mesma variбvel, pois como sabemos, а OnPlayerUpdate й chamada varias vezes por segundos para cada player, exceto se o mesmo estiver de ESC. Ou seja, sempre que possнvel use static em vez de new na OnPlayerUpdate. VIAJOU TAMBЙM HAHAHA
No seu caso realmente nгo alterarб em nada, em vista de usar gettime. Mas й preciso analisar o caso em que se vai usar static, como disse na resposta acima ao renatog, se vocк precisa armazenar um valor diferente para cada jogador, й preciso indexar a static, no seu caso vocк estб certo, a informaзгo que precisa й global entгo nгo difere em nada.
Reply
#12

@XandyMello Eu falei sobre o 'static' pensando em outra coisa, mas de qualquer forma vocк tem razгo pois usei 'new' dentro. Todavia, se for pra contar a criaзгo da variбvel й melhor nem usar:
PHP Code:
static acwTime[MAX_PLAYERS]; 
public 
OnPlayerUpdate(playerid)  
{  
    if((
gettime() - acwTime[playerid]) > WEAPON_HACK_CHECK_TIME
    {  
        
acwTime[playerid] = gettime(); 
        
ChecarAntiXiter(playerid);  
    }  

"ah, mas ta usando a funзгo gettime() duas vezes, й melhor colocar numa variбvel"
Vocк sу vai usar a funзгo gettime() duas vezes a cada 3 segundos, entгo suponho que vale a pena (nгo testei). Claro que se vocк diminuir o tempo pode ser pior, enfim, sгo optimizaзхes pequenas que talvez nem valha a pena discutir aqui heh.

@Bruno
Rapaz, a partir do momento em que vocк designa o valor no inнcio pra cada chamada como o Xandy fez, nгo tem como haver conflito. O ponto que vocк fez й correto quando olha apenas o keyword 'static', mas nгo tem nada a ver com o cуdigo do Xandy.
Reply
#13

Quote:
Originally Posted by renatog
View Post
PHP Code:
static acwTime[MAX_PLAYERS]; 
public 
OnPlayerUpdate(playerid)  
{  
    if((
gettime() - acwTime[playerid]) > WEAPON_HACK_CHECK_TIME
    {  
        
acwTime[playerid] = gettime(); 
        
ChecarAntiXiter(playerid);  
    }  

"ah, mas ta usando a funзгo gettime() duas vezes, й melhor colocar numa variбvel"
Vocк sу vai usar a funзгo gettime() duas vezes a cada 3 segundos, entгo suponho que vale a pena (nгo testei). Claro que se vocк diminuir o tempo pode ser pior, enfim, sгo optimizaзхes pequenas que talvez nem valha a pena discutir aqui heh.
Pensei dessa forma sobre o uso do gettime, mas como considerei um intervalo considerбvel de 3 segundos entгo nem armazenei o valor а uma variбvel, deixando assim:
Code:
if(dataTime[playerid] < gettime())
{
      dataTime[playerid] = gettime() + WEAPON_HACK_CHECK_TIME;
 
      CheckPlayerWeaponHack(playerid);
}
@EDIT

Pessoal, muito obrigado pela colaboraзгo!
Espero obter, juntamente а vocкs, mais melhorias no script.
Reply
#14

Uma dica:

coloca uns hook nas funcoes de dar arma, municao, etc e assim quem usar nao precisa mudar nada e pode continuar a usar as funcoes nativas igual.

contudo claro e chamado quando usam hack a sua callback OnPlayerWeaponHackDetected



Ja agora deixe me lhe dizer bom trabalho +12rep
Reply
#15

Quote:
Originally Posted by PT
View Post
Uma dica:

coloca uns hook nas funcoes de dar arma, municao, etc e assim quem usar nao precisa mudar nada e pode continuar a usar as funcoes nativas igual.

contudo claro e chamado quando usam hack a sua callback OnPlayerWeaponHackDetected



Ja agora deixe me lhe dizer bom trabalho +12rep
Muito obrigado, @PT.
Farei uma versгo com hook, logo atualizo o tуpico.
Reply
#16

Entгo final se eu remover os checkpoints padrгo vai sumir todos neh й que eu quero fazer um novo menu de compras via checkpoins feito em textdraw clicaveis por isso queria remover os padrгo
Reply
#17

Quote:
Originally Posted by GuilhermeNunes
View Post
Entгo final se eu remover os checkpoints padrгo vai sumir todos neh й que eu quero fazer um novo menu de compras via checkpoins feito em textdraw clicaveis por isso queria remover os padrгo
@GuilhermeNunes, sim, sumirгo todos.
Caso queira fazer um menu personalizбvel, volto a repetir: Usando a funзгo da include (ACW_GivePlayerWeapon) nгo haverб bugs.
Reply
#18

Quote:
Originally Posted by F1N4L
View Post
@GuilhermeNunes, sim, sumirгo todos.
Caso queira fazer um menu personalizбvel, volto a repetir: Usando a funзгo da include (ACW_GivePlayerWeapon) nгo haverб bugs.
Ok vlw man Irei testar a sua include dps dou rep pq to no celular
Reply
#19

Falso-positivos:
O slot 12 pertence ao controle da C4 e o 11 ao paraquedas, ambos sгo dados ao jogador automaticamente pelo jogo (quando possui uma C4 e quando alcanзa uma altitude alta).
Reply
#20

Quote:
Originally Posted by RodrigoMSR
View Post
Falso-positivos:
O slot 12 pertence ao controle da C4 e o 11 ao paraquedas, ambos sгo dados ao jogador automaticamente pelo jogo (quando possui uma C4 e quando alcanзa uma altitude alta).
Opa, @RodrigoMSR. Obrigado, estarei atualizando.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)