n ultima vreme am primit foarte multe solicitari cu rugamintea de a inventa un Anticheat functional contra playerilor samp ce folosesc AIM(Joypad) in timpul jocului,astfel lasand ceilalti playeri in dezavantaj. Am luat in considerare toate aceste solicitari si mai jos va voi prezenta ce s-a primit.
In cazul nostru AIM-ul reprezinta un regim de gestionare cu ajutorul Joypad sau o programa(alternativa) "AIM" (un piper pe shortcut).
Algoritm:
In timpul folosirii acestui tip de ochire,la jucator este deconectata tinta,dar exista un cursor rotund care mereu e indreptat spre tinta noastra. In timpul tragerii (vizibil doar pentru cei ce trag,gloantele vor nimeri doar in cazul in care tinta va avea un ping mai mic de 30 sau daca va sta pe loc) verificam spre cine e indreptata tinta. Daca tragerea a avut loc si tinta va lipsi atunci jucatorul foloseste AIM-ul nostru ce l-am descris mai sus (in cazul sistemului meu,jucatorul respectiv va primi Kick pentru folosirea AIM/Joypad).
#define MAX_AIM_TICKS 3
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid) {
if(damagedid == INVALID_PLAYER_ID || !CheckFireArm(GetPlayerWeapon(playerid)) || GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID) return 1;
new count = GetPVarInt(playerid, "aimcount"), ticks = GetPVarInt(playerid, "aimtick"), currtick = GetTickCount();
if(currtick - ticks <= 10000 && count + 1 >= MAX_AIM_TICKS) {
new msg[144], name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(msg, 144, "%s[%i] a primit kick pentru suspectarea in folosirea Aim / Joypad.", name, playerid);
SendClientMessageToAll(-1, msg);
Kick(playerid); // acordam kick cheaterului
// Atentie! Daca veti dori sa schimbati kick intr-o alta sanctiune (de exemplu: un simplu mesaj) — adaugati aici stergerea "PVAR"-urilor si anularea variabilei "count" (ca si in codul operatorului "else if" de mai jos)
}
else if(currtick - ticks > 10000) {
DeletePVar(playerid, "aimcount");
DeletePVar(playerid, "aimtick");
count = 0;
currtick = GetTickCount();
}
SetPVarInt(playerid, "aimcount", count + 1);
SetPVarInt(playerid, "aimtick", currtick);
return 1;
}
CheckFireArm(weaponid) {
switch(weaponid) {
case 16..39, 41..43: return 1;
default: return 0;
}
return 0;
}