GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: LePtitClown le 09 Avril 2012, 10:35:19

Titre: Problème d'anti cheat armure
Posté par: LePtitClown le 09 Avril 2012, 10:35:19
Slt

Je suis en train de faire un anti cheat pour lutter contre les cheat d'armure mais j'ai quelque soucis. Voici mon code:

new Float:armourhack[MAX_PLAYERS];

armourhack[playerid]=0;//dans OnPlayerConnect
armourhack[playerid]=0;//dans OnPlayerDisconnect


stock GetPlayerArmourhack(playerid)
{
return armourhack[playerid];
}

stock SetPlayerArmourhack(playerid,Float:armour)
{
GetPlayerArmourhack(playerid);
armourhack[playerid]= SetPlayerArmour(playerid,armour);
}

Il y a évidemment un timer qui compare la variable à GetPlayerarmour et qui banni si ces 2 valeurs ne sont pas égales. Ces 2 fonctions remplaceraient mes 2 fonctions SetPlayerArmour et GePlayerArmour pour permettre un suivi de l'armure du joueur grâce à une variable. Hélas, il y a toujours des soucis au moment de la compilation.
Des idées pour corriger ceci? Merci d'avance.
Titre: Re : Problème d'anti cheat armure
Posté par: Xartrick le 09 Avril 2012, 18:04:06
stock SetPlayerArmourhack(playerid, Float:armour) // <----------------\
{                                                               //    |
GetPlayerArmourhack(playerid);                          //    |
                                                        //    |
armourhack[playerid]= SetPlayerArmour(playerid,armour); // ---/
}
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 14 Avril 2012, 20:38:38
Slt

Je ne comprend pas où tu veux en venir ???

A+ :)
Titre: Re : Problème d'anti cheat armure
Posté par: Ssk le 14 Avril 2012, 20:54:05
En gros tu créer une fonction qui s'appelle elle même, donc ça te fait une "boucle infinie"
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 15 Avril 2012, 12:52:08
Slt

Oui en effet, mais moi ce que je veux c'est que lorsque je tape cette fonction, ma variable prend la valeur de la vie du joueur.

stock SetPlayerArmourhack(playerid,Float:armour)
{
SetPlayerArmour(playerid,armourhack[playerid]);
}

Il faudrait mettre ça comme ça ??
Titre: Re : Problème d'anti cheat armure
Posté par: Xartrick le 18 Avril 2012, 14:08:40
new Float:fPlayerArmour[MAX_PLAYERS] = {0.0};

stock GetPlayerArmourFromServer(playerid) {
    return fPlayerArmour[playerid];
}

stock SetPlayerArmourFromServer(playerid, Float:fArmour) {
    SetPlayerArmour(playerid, fArmour);
    
    fPlayerArmour[playerid] = fArmour;
}

stock IsArmourHacking(playerid) {
    if (GetPlayerArmour(playerid) != GetPlayerArmourFromServer(playerid)){
        return true;
    }
    
    return false;
}

Voilà un code fonctionnel et relativement complet.
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 22 Avril 2012, 20:22:28
Slt

J'ai essayé de mettre ce code sur mon serveur mais je rencontre une erreur avec une de tes fonction:

stock GetPlayerArmourFromServer(playerid)
{
    return fPlayerArmour[playerid];
}

L'erreur se trouve à la ligne: return fPlayerArmour[playerid]

Le message d'erreur est:

Citer
warning 213: tag mismatch

A+ ;)
Titre: Re : Problème d'anti cheat armure
Posté par: Gilux le 22 Avril 2012, 20:31:03
L'armure c'est du type float je crois, ajoute ça dans les paramètres ;)
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 22 Avril 2012, 20:53:23
Mais elle est déjà définit en Float:
new Float:fPlayerArmour[MAX_PLAYERS] = {0.0};
Je ne comprend pas où tu veux en venir ;D
Titre: Re : Problème d'anti cheat armure
Posté par: spiirou le 22 Avril 2012, 22:01:30
On ne peux pas retourner un float ? Il faut le mettre dans les parametres non ?

stock GetPlayerArmourFromServer(playerid, &Float:armure)
{
    armure = fPlayerArmour[playerid];
}

Ca se fait ca ?
Titre: Re : Problème d'anti cheat armure
Posté par: Xartrick le 22 Avril 2012, 22:25:11
Les tags ne sont pas d'une importance capitale, si vous voulez les utiliser, il faut le faire jusqu'à bout:

new Float:fPlayerArmour[MAX_PLAYERS] = {0.0};

stock Float:GetPlayerArmourFromServer(playerid) {
    return Float:fPlayerArmour[playerid];
}

stock SetPlayerArmourFromServer(playerid, Float:fArmour) {
    SetPlayerArmour(playerid, fArmour);
   
    fPlayerArmour[playerid] = fArmour;
}

stock IsArmourHacking(playerid) {
    if (GetPlayerArmour(playerid) != GetPlayerArmourFromServer(playerid)){
        return true;
    }
   
    return false;
}

Sinon, pour la ligne suivante:

new Float:fPlayerArmour[MAX_PLAYERS] = {0.0};
J'initialise toutes les valeurs du tableau à 0.0 (soit 0).
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 27 Avril 2012, 19:54:00
Slt

stock Float:GetPlayerArmourHack(playerid)
En utilisant ce nouveau Float dans la fonction précédente, j'obtiens le message d'erreur ci dessous:
Citer
warning 208: function with tag result used before definition, forcing reparse
fonction avec résultat étiquette utilisée avant la définition, ce qui oblige une révision

Si vous avez des idées pour réparer ce problème, je suis preneur

A+ ;)
Titre: Re : Problème d'anti cheat armure
Posté par: Xartrick le 27 Avril 2012, 21:54:25
Le prototype doit être défini avant l'utilisation.
Met tous tes prototypes dès le début de ton script, ça sera plus simple.


stock Float:GetPlayerArmourFromServer(playerid);
stock SetPlayerArmourFromServer(playerid, Float:fArmour);
stock IsArmourHacking(playerid);

new Float:fPlayerArmour[MAX_PLAYERS] = {0.0};

stock Float:GetPlayerArmourFromServer(playerid) {
    return Float:fPlayerArmour[playerid];
}

stock SetPlayerArmourFromServer(playerid, Float:fArmour) {
    SetPlayerArmour(playerid, fArmour);
   
    fPlayerArmour[playerid] = fArmour;
}

stock IsArmourHacking(playerid) {
    if (GetPlayerArmour(playerid) != GetPlayerArmourFromServer(playerid)){
        return true;
    }
   
    return false;
}
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 28 Avril 2012, 14:31:42
Slt

Merci beaucoup, ça fonctionne nickel. Par contre, je ne compred pas pourquoi je ne peux pas vérifier l'armure dans un timer.
Lorsque je laisse le timer faire, je suis ban en permanence.
Dès que je tape une cmd pour avoir un gilet, le message s'arrête

if (strcmp("/test", cmdtext, true) == 0)
{
SetPlayerArmourHack(playerid, 50);
format(string1, sizeof(string1), "var armour: %f", armourhack[playerid]);
SendClientMessageToAll(COLOR_INFO, string1);
return 1;
}
   
Titre: Re : Problème d'anti cheat armure
Posté par: spiirou le 28 Avril 2012, 14:40:35
Tu fais comment dans le Timer ? ( code ? )
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 28 Avril 2012, 16:08:41
Bah un timer avec une boucle tout simplement

Mais là, avec un autre test, j'ai remarqué que lorsque je me connecte, j'ai le message qui dit banni. Je tape /test, je ne suis plus banni. Ensuite, je cheat, je ne suis pas banni
Titre: Re : Problème d'anti cheat armure
Posté par: Xartrick le 29 Avril 2012, 22:32:11
Lors de la connexion/apparition, l'armure du joueur n'est pas la même que dans le variable du côté serveur.
Il faut que tu mette l'armure à zéro (par exemple) à la connexion, avec la nouvelle fonction.


SetPlayerArmourFromServer(playerid, 0.0);
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 05 Mai 2012, 20:43:44
Non ça ne change hélas rien. Pour tenter de réparer le pb, j ai créer 4 cmd de tests. Voici les résultats obtenus pour chacune d'elle.
if (strcmp("/a1", cmdtext, true) == 0)
{
       SetPlayerArmourHack(playerid,100);
format(string1, sizeof(string1),"armourhack[playerid]=%f",armourhack[playerid]);
  SendClientMessage(playerid,COLOR_INFO, string1);
return 1;
}
Résultat: la variable armourhack passe à 100 comme il faut et le gilet apparait
PS: Dès la première commande, je ne reçois plus aucun message pour me signaler que je cheat

if (strcmp("/a2", cmdtext, true) == 0)
{
format(string1, sizeof(string1),"armourhack[playerid]=%f",armourhack[playerid]);
  SendClientMessage(playerid,COLOR_INFO, string1);
return 1;
}
Résultat: Après m'être tué, je n'ai donc plus de gilet, je tape cette commande. Surprise, la variable est resté à 100

if (strcmp("/a3", cmdtext, true) == 0)
{
   SetPlayerArmourHack(playerid,armourhack[playerid]);
format(string1, sizeof(string1),"armourhack[playerid]=%f",armourhack[playerid]);
  SendClientMessage(playerid,COLOR_INFO, string1);
return 1;
}
Résultat: Je fais exprès de perdre un peu d'armure en m explosant et je tape cette commande, surprise, ma variable est toujours à 100 et un gilet apparait

if (strcmp("/a4", cmdtext, true) == 0)
{
   SetPlayerArmour(playerid,100);
format(string1, sizeof(string1),"armourhack[playerid]=%f",armourhack[playerid]);
  SendClientMessage(playerid,COLOR_INFO, string1);
return 1;
}
Résultat: Ma variable ets toujours à 100, un gilet apparait mais je ne suis pas prévenu que je suis en train de cheater.

Ma conclusion:

- La variable n'est pas remise à jour correctement dans la fonction SetPlayerArmourHack

Je remet le code au cas où sur le pastebin: http://pastebin.com/v94YhrdS (http://pastebin.com/v94YhrdS)

Aidez moi svp :)

A+ ;)
Titre: Re : Problème d'anti cheat armure
Posté par: spiirou le 05 Mai 2012, 21:49:42
Faut pas oublier de mettre un RefreshArmourHack dans le cas où le joueur se fait toucher, quand il se connecte, respawn

RefreshArmourHack(playerid)
{
     armourhack[playerid] = GetPlayerArmour(playerid);
}

De façon à actualiser la variable ;)
Titre: Re : Problème d'anti cheat armure
Posté par: LePtitClown le 05 Mai 2012, 23:29:21
J'ai testé en mettant le code ci-dessosu dans la fonction setplayerarmour
armourhack[playerid] = GetPlayerArmour(playerid);
Normalement, ça doit donc être mis à jour après la fonction mais ça revient à pareil qu'avant sauf que c'est plus 100 qui est renvoyé mais 0 ;D
Titre: Re : Problème d'anti cheat armure
Posté par: Xartrick le 06 Mai 2012, 04:56:48
Le code de spiirou ne ferait que rendre obsolète l'anti-cheat.
Ce qu'il faut faire, c'est simplement remettre l'armure du joueur à zéro quand il meurt (avec la fonction que l'on à créer).
Titre: Re : Problème d'anti cheat armure
Posté par: spiirou le 06 Mai 2012, 09:15:14
Erf oui je m'en suis rendu compte cette nuit mdr! Désolé!  ;D
Mais il n’empêche qu'il faudrait baisser la variable armourhack quand le joueur encaisse des dégâts non ? Idem s'il va a l'ammunation..
Je réfléchi a un truc complet ;)