Anti Weapon Hack
#1

Hello there, i just want to ask if im doing my anticheat in right way, im not totaly sure about it if anyone have any suggestion to add here feel free to post it here...

Код HTML:
public SafeGivePlayerWeapon(playerid, weaponid, ammo)
{
    new ammo2 = GetPlayerAmmo(playerid);
	if(PlayerInfo[playerid][pWeapon] == 0 && PlayerInfo[playerid][pAmmo] == 0 || PlayerInfo[playerid][pWeapon] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon] = weaponid;
		    PlayerInfo[playerid][pAmmo] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon2] == 0 && PlayerInfo[playerid][pAmmo2] == 0 || PlayerInfo[playerid][pWeapon2] == weaponid)
	{
	    if(PlayerInfo[playerid][pAmmo2] == weaponid)
	    {
		    PlayerInfo[playerid][pAmmo2] == ammo + ammo2;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pAmmo2] = ammo;
		    PlayerInfo[playerid][pWeapon2] == weaponid;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon3] == 0 && PlayerInfo[playerid][pAmmo3] == 0 || PlayerInfo[playerid][pWeapon3] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon3] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo3] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon3] = weaponid;
		    PlayerInfo[playerid][pAmmo3] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon4] == 0 && PlayerInfo[playerid][pAmmo4] == 0 || PlayerInfo[playerid][pWeapon4] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo4] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon4] = weaponid;
		    PlayerInfo[playerid][pAmmo4] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon5] == 0 && PlayerInfo[playerid][pAmmo5] == 0 || PlayerInfo[playerid][pWeapon5] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo5] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon5] = weaponid;
		    PlayerInfo[playerid][pAmmo5] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon6] == 0 && PlayerInfo[playerid][pAmmo6] == 0 || PlayerInfo[playerid][pWeapon6] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon6] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo6] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon6] = weaponid;
		    PlayerInfo[playerid][pAmmo6] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon7] == 0 && PlayerInfo[playerid][pAmmo7] == 0 || PlayerInfo[playerid][pWeapon7] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon7] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo7] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon7] = weaponid;
		    PlayerInfo[playerid][pAmmo7] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon8] == 0 && PlayerInfo[playerid][pAmmo8] == 0 || PlayerInfo[playerid][pWeapon8] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon8] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo8] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon8] = weaponid;
		    PlayerInfo[playerid][pAmmo8] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon9] == 0 && PlayerInfo[playerid][pAmmo9] == 0 || PlayerInfo[playerid][pWeapon9] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon9] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo9] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon9] = weaponid;
		    PlayerInfo[playerid][pAmmo9] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon10] == 0 && PlayerInfo[playerid][pAmmo10] == 0 || PlayerInfo[playerid][pWeapon10] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon10] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo10] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon10] = weaponid;
		    PlayerInfo[playerid][pAmmo10] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon11] == 0 && PlayerInfo[playerid][pAmmo11] == 0 || PlayerInfo[playerid][pWeapon11] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon11] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo11] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon11] = weaponid;
		    PlayerInfo[playerid][pAmmo11] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else if(PlayerInfo[playerid][pWeapon12] == 0 && PlayerInfo[playerid][pAmmo12] == 0 || PlayerInfo[playerid][pWeapon12] == weaponid)
	{
	    if(PlayerInfo[playerid][pWeapon12] == weaponid)
	    {
	        PlayerInfo[playerid][pAmmo12] = ammo + ammo2;
	        GivePlayerWeapon(playerid, weaponid, ammo);
		}
		else
		{
		    PlayerInfo[playerid][pWeapon12] = weaponid;
		    PlayerInfo[playerid][pAmmo12] = ammo;
		    GivePlayerWeapon(playerid, weaponid, ammo);
		}
	}
	else
	{
	    new giveplayer[MAX_PLAYER_NAME];
	    GetPlayerName(i, giveplayer, sizeof(giveplayer));
	    new string[35];
		format(result,sizeof(result), "[DEBUG] Error at function SafeGivePlayerWeapon with player %s(%d)", giveplayer, playerid);
		print(string);
	}
	ScriptWeaponsUpdated[playerid] = 1;
    SetTimerEx("UpdateWeapons",2500,false,"i",playerid);
	return 1;
}
forward MaticAntiWeaponHack();
public MaticAntiWeaponHack()
{
	new Wep[MAX_PLAYERS];
	new ammo[MAX_PLAYERS];
	new string[128];
	new WeponCheckDone[MAX_PLAYERS];
	new giveplayer[MAX_PLAYER_NAME];
	for(new i = 0; i < MAX_PLAYERS; i++)
	{
	    if(gPlayerLogged[i] == 1)
	    {
		  	Wep[i] = GetPlayerWeapon(i);
			ammo[i] = GetPlayerAmmo(i);
			GetPlayerName(i, giveplayer, sizeof(giveplayer));
			if(PlayerInfo[i][pWeapon] == Wep[i] && PlayerInfo[i][pAmmo] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon2] == Wep[i] && PlayerInfo[i][pAmmo2] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon3] == Wep[i] && PlayerInfo[i][pAmmo3] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon4] == Wep[i] && PlayerInfo[i][pAmmo4] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon5] == Wep[i] && PlayerInfo[i][pAmmo5] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon6] == Wep[i] && PlayerInfo[i][pAmmo6] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon7] == Wep[i] && PlayerInfo[i][pAmmo7] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon8] == Wep[i] && PlayerInfo[i][pAmmo8] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon9] == Wep[i] && PlayerInfo[i][pAmmo9] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon10] == Wep[i] && PlayerInfo[i][pAmmo10] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon11] == Wep[i] && PlayerInfo[i][pAmmo11] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(PlayerInfo[i][pWeapon12] == Wep[i] && PlayerInfo[i][pAmmo12] == ammo[i]) { WeponCheckDone[i] = 1; }
			else if(WeponCheckDone[i] == 0)
			{
			    format(string, sizeof(string), "%s Has Been kicked for possible money hacking!", giveplayer);
			    SendClientMessageToAll(COLOR_RED, string);
			    Kick(i);
			}
		}
		SetTimer("MaticAntiWeaponHack", 10000, false);
	}
	return 1;
}
Reply
#2

There's no need to check if they're logged in unless you force them to register before they can even play.

There are a LOT of things that can go wrong with weapon hax checks, spawning and lag just to name a few. I would definitely not automatically kick the player, instead send it to admin chat that the player might be hacking and include the server and client weapon / ammo information.

The SetTimer("MaticAntiWeaponHack", 10000, false); line should only have to go in your OnGameModeInit / OnFilterscriptInit, I don't see what putting it in the main AC function does for you other than remake the timer over and over every time it gets triggered. Which seems a bit wasteful.

You're doing a LOT more in SafeGivePlayerWeapon than you have to. I suggest you make a new boolrotected[MAX_PLAYERS] and set that to true in your SafeGivePlayerWeapon. After that, check if he's paused - if he is, wait for him to come back before doing you give him the weapon, otherwise protect him with protected to give him some time to sync.

Be aware that default ammunations in SAMP are all client-side. You should look around the forums for a scripted Ammunation filterscript and then whenever you give the player a gun with it, protect him. If you really want to keep the default ones (I don't recommend it), you will want to check if he's inside an ammunation and if he is, protect him from the weapon check.

This may also help you:

pawn Код:
for (new j = 0; j < 13; j++) {
    new wep, ammo;
    GetPlayerWeaponData(i, j, wep, ammo);
   
    if (ammo == 0) continue;
   
    if (((Wep[i][j] != wep) || (ammo[i][j] < ammo)) && wep != 46 && wep != 40 && !Protection{i}) { //46 = parachute, player gets it when he exits certain aircraft. 40 = detonator from satchels
        new t[126];
        format(t, sizeof(t), "%s[%i] - Possibly pulled a %s with %i ammo out of his ass", playerName(i), i, GetWeaponName(wep), (ammo - ammo[i][j]));
        sendAdminChat(t);
    }
   
    //Save all his client-side weapon data to his server-side info here. even if he really is weapon hacking, you don't want the chat to get spammed.
   
    WeponCheckDone[i] = 1;
}
Good luck.
Reply
#3

Thanks for help, i remade it hope its better:

Код:
public SafeGivePlayerWeapon(playerid, weaponid, ammo)
{
	for(new j = 0; j < 13; j++)
	{
		new wep, ammo23;
		GetPlayerWeaponData(playerid, j, wep, ammo23);
		{
			if(AntiCheatWeapon[playerid][j] == wep)
			{
				AntiCheatAmmo[playerid][j] = ammo23+ammo;
				GivePlayerWeapon(playerid, weaponid, ammo);
			}
			else if((AntiCheatWeapon[playerid][j] != wep) && (AntiCheatAmmo[playerid][j] == 0))
			{
			    AntiCheatAmmo[playerid][j] = ammo;
			    AntiCheatWeapon[playerid][j] = wep;
			}
		}
	}
	ScriptWeaponsUpdated[playerid] = 1;
    SetTimerEx("UpdateWeapons",2500,false,"i",playerid);
	return 1;
}
forward MaticAntiWeaponHack();
public MaticAntiWeaponHack()
{
	new t[128];
	new WeponCheckDone[MAX_PLAYERS];
	new giveplayer[MAX_PLAYER_NAME];
	for(new i = 0; i < MAX_PLAYERS; i++)
	{
	    if(gPlayerLogged[i] == 1)
	    {
			for(new j = 0; j < 13; j++)
			{
			    new wep, ammo;
			    GetPlayerWeaponData(i, j, wep, ammo);

			    if(ammo == 0)
				{
					continue;
				}
			    if(((AntiCheatWeapon[i][j] != wep) || (AntiCheatAmmo[i][j] < ammo)) && wep != 46 && wep != 40)
				{
					GetPlayerName(i, giveplayer, sizeof(giveplayer));
					if(admins >= 1)
					{
						format(t, sizeof(t), "%s[%i] - Has Been Kicked for possible weapon hacking!!", giveplayer, i);
						SendClientMessageToAll(COLOR_NICERED,t);
						Kick(i);
					}
					else
					{
					    new HackedAmmo123;
					    HackedAmmo123 = ammo-AntiCheatAmmo[i][j]
						format(t, sizeof(t), "%s[%d] - Is possible weapon(SLOT:%d AMMO: %s) hecking check him!(/checkweapons) ", giveplayer, i, j,HackedAmmo123);
						SendAdminMessage(COLOR_NICERED,t);
					}
			    }
			    WeponCheckDone[i] = 1;
			}
		}
		SetTimer("MaticAntiWeaponHack", 10000, false);
	}
	return 1;
}

public SafeResetPlayerWeapons(playerid)
{
	ScriptWeaponsUpdated[playerid] = 1;
	ResetPlayerWeapons(playerid);
	for(new j = 0; j < 13; j++)
	{
	    AntiCheatWeapon[playerid][j] = 0;
	    AntiCheatAmmo[playerid][j] = 0;
	}
	SetTimerEx("UpdateWeapons",2500,false,"i",playerid);
	return 1;
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)