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
-
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.
-
stock SetPlayerArmourhack(playerid, Float:armour) // <----------------\
{ // |
GetPlayerArmourhack(playerid); // |
// |
armourhack[playerid]= SetPlayerArmour(playerid,armour); // ---/
}
-
Slt
Je ne comprend pas où tu veux en venir ???
A+ :)
-
En gros tu créer une fonction qui s'appelle elle même, donc ça te fait une "boucle infinie"
-
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 ??
-
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.
-
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:
warning 213: tag mismatch
A+ ;)
-
L'armure c'est du type float je crois, ajoute ça dans les paramètres ;)
-
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
-
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 ?
-
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).
-
Slt
stock Float:GetPlayerArmourHack(playerid)
En utilisant ce nouveau Float dans la fonction précédente, j'obtiens le message d'erreur ci dessous:
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+ ;)
-
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;
}
-
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;
}
-
Tu fais comment dans le Timer ? ( code ? )
-
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
-
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);
-
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+ ;)
-
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 ;)
-
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
-
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).
-
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 ;)