Bonjour,
Alors j'ai une mauvaise nouvelle, ton code ne fonctionne pas plus Syg.
Mais j'ai trouvé la solution: Utilisé un booléen qui indique à l'anticheat si le joueur peut ou non utiliser l'armure.
stock SetPlayerArmourEx(playerid, Float:varArmor)
{
CanUseArmour[playerid] = 1; // Indique que le joueur peut utiliser l'armure qu'il a acheté / trouvé
SSArmor[playerid] = varArmor;
return SetPlayerArmour(playerid,varArmor);
}
Ensuite, au lieu d'utiliser un Timer, j'ai préféré utilise OnPlayerUpdate qui est, selon moi, plus adapté pour un anti-cheat bien que mon propos peut être discutable.
public OnPlayerUpdate(playerid)
{
if(IsSpawned[playerid] == 1 && AdminLevel[playerid] == 1337)
{
new Float:tArmor;
GetPlayerArmour(playerid, tArmor);
if(tArmor != SSArmor[playerid]) /* Premier contrôle */
{
/* On récupère l'armure pour un double controle */
GetPlayerArmour(playerid, tArmor);
if(tArmor < SSArmor[playerid]) /* Deuxième contrôle */
{
SSArmor[playerid] = tArmor;
}
else if(tArmor > SSArmor[playerid])
{
if(CanUseArmour[playerid] == 1) // Si le joueur peut utiliser l'armure qu'il a acheté/trouvé
{
CanUseArmour[playerid] = 0;
SSArmor[playerid] = tArmor; // alors on met à jour la variable qui n'avait pas été mise à jour pour une raison inconnue ??
}
else // Sinon cela signifie qu'il a cheaté donc:
{
new username[MAX_PLAYER_NAME], string[150];
GetPlayerName(playerid,username,sizeof(username));
format(string,sizeof(string),"[ANTI-CHEAT]"ECOLOR_WHITE" %s(%d) a tenté de regénérer son armure.", username,playerid);
SendClientMessageToAllAdmins(string);
SetPlayerArmour(playerid,SSArmor[playerid]);
}
}
}
}
return 1;
}
Et sa fonctionne d'après mes tests !
Je pense qu'en réalité la variable SSArmor n'avait pas le temps de se mettre à jour car elle était reset aussitôt, j'ai remarqué sa car le bug était plus flagrant en utilisant OnPlayerUpdate qu'avec un timer (qui est exécuté moins souvent);
Que pensez vous de ma solution ?
Merci