Crйer son propre anti-cheat -
S4t3K - 24.04.2014
Yop.
Les cheaters sont l'ennemi des bons serveurs, mais je vois plein de serveurs qui sont trиs bons mais qui percent pas а cause de l'absence d'anti cheat.
Ce tuto va vous montrer quelques astuces pour crйer votre propre anti cheat
Pour commencer, vous avez besoin de dйtecter si le joueur cheat/a cheatй. Pour зa, rien de plus simple.
Je vous conseille d'utiliser OnPlayerUpdate (ou un thread) pour зa.
Vous devez vous dire "Mais dans quelle merde il va encore me foutre ce bg ?", attendez, vous allez comprendre.
Dйjа, prenez
cette petite include (source).
Notez que je n'ai crйй ces fonctions que pour vous "montrer" la marche а suivre pour crйer les vфtres plus tard
Une fois que vous les avez, enregistrez les dans un fichier bloc-notes, et enregistrez ce fichier bloc-notes comme anticheat.inc (Format : tous les fichiers ; Encodage : UTF-8 ). Placez ensuite anticheat.inc dans votre dossier pawno\includes, lа oщ y'a a_samp.inc
Si vous savez coder en pawn, les fonctions devraient pas кtre trop dures а comprendre, mais (et puisque ce tuto s'adresse principalement aux dйbutants) je prends quand mкme le temps de l'expliquer au travers d'un exemple : la premiиre fonction que j'ai mise dans l'include (totalement involontairement, nofake),
PHP Code:
AC_GivePlayerWeapon(playerid, weaponid, muni)
{
SetPVarInt(playerid, "Weapon", 1);
GivePlayerWeapon(playerid, weaponid, muni);
SetTimerEx("stopWeapon", 300, false, "i", playerid);
return 1;
}
Le nom est un peu barbare (un tout petit peu), mais on s'en cogne du nom (voir les directives de prй-processeur au sommet que je rйexpliquerais). Bizarrement (nan j'dйconne, c'est voulu) la fonction a les mкmes paramиtres que GivePlayerWeapon.
La premiиre ligne est une fonction qui place un PVar (variable joueur) entier sur le joueur, entier qui vaut 1.
La deuxiиme ligne est justement un GivePlayerWeapon, fonction qui donne une arme avec un nombre de munitions spйcifiйes.
La troisiиme ligne est un timer qui appelera la fonction
stopWeapon 300 millisecondes aprиs que le script ait lu l'instruction.
Pourquoi 300 ms ? : Parce que c'est un temps ni trop long, qui ne permet donc pas au joueur de se faire bannir par l'anti cheat si il ne cheat pas, ni trop court, qui ne permet donc pas au possible cheater de spawn une deuxiиme arme entre temps (vous comprendrez).
Vous pourriez trиs bien prendre n'importe quelle valeur entre 100 et 500 ms (conseillй), зa changerait rien (thйoriquement, sauf si le joueur est extrкmement rapide pour 500).
Concrиtement, la macro fait quoi ? Elle donne une arme au joueur et met une sorte d'indicateur sur le joueur qui indique а l'anti cheat que le joueur a eu l'arme via une instruction dans le script.
Rappelez-vous, plus haut je vous ai parlй de OnPlayerUpdate, et vous n'avez pas du comprendre pourquoi j'ai parlй de зa, chose tout а fait normale (sauf si vous кtes en moi ou que vous кtes trиs trиs trиs intelligent).
Lа, vous comprenez mieux ou pas ?
Si oui, gg, t for, tu ve 1 kouki ?
Si non, j'explique.
OnPlayerUpdate est appelйe lorsqu'un quelconque changement (vie, position, vitesse, armure, animation, etc) survient sur le joueur (playerid).
On va se servir de зa, combinй а l'include anticheat, pour dйtecter si le joueur a cheatй !
Essayez de faire le code vous-mкme avant de lire la suite, зa fera un peu de pratique, car lire passivement c'est bien, pratiquer зa rentre mieux.
Combinez les fonctionnalitйs de OnPlayerUpdate (c'est pour зa que je parlais d'utiliser OnPlayerUpdate de prйfйrence) avec les fonctions de l'include anticheat et faоtes moi un beau code, puis comparez avec le mien.
Perso' je vais juste vous montrer mon code pour GivePlayerWeapon, mais grosso modo suffira de modifier le nom de la callback, c'est tout.
Derniиre prйcision, j'ai oubliй de vous prйciser les prй-processeurs en haut de l'include, ceux-lа :
PHP Code:
#define GivePlayerWeapon AC_GivePlayerWeapon
#define SetPlayerHealth AC_SetPlayerHealth
#define SetPlayerArmour AC_SetPlayerArmour
#define SetPlayerPos AC_SetPlayerPos
#define GivePlayerMoney AC_GivePlayerMoney
#define AddVehicleComponent AC_AddVehicleComponent
En gros, puisque utiliser AC_GivePlayerWeapon а chaque fois au lieu de GivePlayerWeapon et que vous avez peut-кtre dйjа une base de gamemode mais que vous voulez pas vous amuser а CTRL + H partout, l'include fait croire au compilateur que lorsque vous utilisez la fonction GivePlayerWeapon, en rйalitй vous appelez AC_GivePlayerWeapon, ce qui fait que vous pouvez continuer а scripter comme vous savez le faire, sans vous soucier du nom des fonctions.
Voilа, j'ai du assez vous aider sans vous donner le code !
Bon, lа c'est comme sur le tuto de l'opti des fonctions, soit vous кtes lа parce que vous m'йcoutez pas et que vous lisez passivement (o passage vous avez du violer votre molette mdйrr) soit que vous avez fait votre code.
Perso', j'en йtais lа pour mon code
PHP Code:
#include <a_samp>
#include <anticheat>
static pWeapons[12] = {0};
static pAmmo[12] = {0};
public OnPlayerUpdate(playerid)
{
new weapons[12], ammo[12];
for(new s = 0; s < 12; s++)
{
GetPlayerWeaponData(playerid, s, weapons[s], ammo[s]);
if(weapons[s] != pWeapons[s] && GetPVarInt(playerid, "Weapons") != 1) BanEx(playerid, "Cheat dgun !");
pWeapons[s] = weapons[s];
}
}
Votre code ressemblait а зa ?
Oui ? GG, t's for, tu ve 1 deuziйm kouki ?
Non ? Pas grave, vous lisez зa pour apprendre. Je crois que si vous savez faire un anti cheat, vous avez mкme pas tentй de faire le code, donc bah voilа quoi
Et lа je vois bien les gens me dire
Attend satek ф grand dieu, tu sais que si le joueur perd une arme ou qu'on applique ResetPlayerWeapons sur lui, bah il sera quand mкme banni alors que par exemple pour TP dans les intйrieurs, on utilise ResetPlayerWeapons laul
Ouai c'est vrai, mais j'ai dit plus haut que vous pourrez faire vos propres fonctions sur ce modиle.
Par exemple, pourquoi ne pas faire un AC_ResetPlayerWeapons ensemble ? (ensemble mdrr, en fait jvais faire le code vous allez faire tminik d'avoir essayй & vous allez dire oй g fй pareil laull)
Prenez la fonction AC_GivePlayerWeapon() en modиle et remplacez ce qu'il faut lа oщ il faut.
Pareil, essayez de votre cфtй et descendez voir si votre rйsultat correspond au mien
Bon, йtape de vйrification izer
PHP Code:
#define ResetPlayerWeapons AC_ResetPlayerWeapons
AC_ResetPlayerWeapons(playerid)
{
SetPVarInt(playerid, "Weapons", 1);
ResetPlayerWeapons(playerid);
SetTimerEx("stopWeapon", 300, false, "i", playerid);
return 1;
}
Wala, pourquoi on se sert toujours de la PVar "Weapons" et aussi du mкme timer avec la mкme fonction ?
C'st trиs simple jeune pomme. Avec le code que je vous ai montrй ci-dessus (celui avec OnPlayerUpdate), on vйrifie si la variable Weapons est bien appliquйe au joueur. Donc si on retire une arme au joueur, thйoriquement, on agit aussi sur les armes donc on applique la mкme variable que si on lui en donnait une.
Ca peut paraоtre flou dans votre tкte, mais а force de pratiquer vous finirez par comprendre vous verrez.
Bon bah si vous avez bien suivi, vous venez de crйer (ou
je viens de vous crйer) un anti d(rop)-gun qui bannira le joueur si il spawn une arme avec un cheat.
Pour la santй, concrиtement c'est le mкme systиme (donc armure aussi), pour la position aussi (quoiqu'un anti tp зa prendra en compte un radius assez large du genre 30.0 unitйs un truc comme зa, bref moi mкme j'ai pas encore trouvй mdrr), pour l'argent aussi et pour le tuning faudrait un peu plus rйflйchir tiens.
Votre prochaine et derniиre mission pour ce tutoriel sera de crйer votre version d'anti cheat tuning !
Comme d'habitude, faоtes et scroll down pour vйrifier.
Bon, йtape de vйrif ?
PHP Code:
#include <a_samp>
#include <anticheat>
public OnVehicleMod(playerid, vehicleid, componentid)
{
if(GetPVarInt(playerid, "Tuning") != 1 && GetPlayerInterior(playerid) == 0) BanEx(playerid, "Cheat tuning !");
return 1;
}
Quand j'disais qu'il fallait rйflйchir, c'йtait pas pour le code car comme vous pouvez le voir il est hyper simple, mais plutфt pour la callback dans laquelle le code doit кtre placй.
Comme dit dans le wiki,
Ce qui fait qu'elle est appelйe mкme quand un cheater utilise s0be!t ou un Cleo pour tuner son vйhicule sans payer (le malhonnкte
).
C'est donc la callback idйale, vu que si le joueur a bien utilisй un plan de tuning avec une commande ou dans un Transfender, il aura soit un intйrieur diffйrent de 0 (j'ai repris l'exemple du wiki pour зa, je plaide coupable
), soit le marqueur "Tuning" а 1, et par consйquent ne sera pas banni.
Je crois que le tutoriel est terminй, je pense avoir йtй assez clair sur le sujet, mais si vous avez des questions, hйsitez pas, ma boоte MP est ouverte (et au pire contactez Kilou si je suis inactif pendant un moment, il saura au moins aussi bien que moi vous expliquer comment faire).
Bonne soirйe les gonzes.