what bad in this anti cheat?
#1

Код:
#include <a_samp>
#include <foreach>
#include <zcmd>
#include <sscanf2>

#define COLOR_WHITE			0xFFFFFFFF

#define RELEASED(%0) \
	(((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))

/*
13 - slot id
1- weapon id, 2 - ammo

Feature things:

*/

new Weapons[MAX_PLAYERS][13][2], bool:Spawned[MAX_PLAYERS], bool:CanCheck[MAX_PLAYERS];

main() { }

public OnGameModeInit()
{
    AddPlayerClass(0, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
    print("Serveris paleistas.");
	return true;
}

public OnPlayerConnect(playerid)
{
	Spawned[playerid] = false;
	CanCheck[playerid] = false;
    AC_ResetPlayerWeapons(playerid, true);
    return true;
}

public OnPlayerSpawn(playerid)
{
    CanCheck[playerid] = false;
    Spawned[playerid] = true;
    return true;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    Spawned[playerid] = false;
    return true;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if (RELEASED(KEY_FIRE))
	{
	    new slotid = GetWeaponSlotByWepID(GetPlayerWeapon(playerid));
	    SetTimerEx("AC_UpdatePlayerWeaponAmmo", 100, false, "ii", playerid, slotid);
	}
	return true;
}

public OnPlayerDisconnect(playerid, reason)
{
	return true;
}

public OnPlayerCommandPerformed( playerid, cmdtext[], success )
{
	if( !success )
	{
	    SendClientMessage(playerid, COLOR_WHITE, "Komanda nerasta.");
		return true;
	}
	else
	{
		new pName[ MAX_PLAYER_NAME ];
		GetPlayerName( playerid, pName, MAX_PLAYER_NAME );
		printf( "[ID:%i] %s has called command: %s.", playerid, pName, cmdtext );
		return true;
	}
}

/*COMMAND:kill(playerid, params[])
{
    SetPlayerHealth(playerid, 0.0);
	return true;
}

COMMAND:ginklus(playerid, params[])
{
    ResetPlayerWeapons(playerid);
	return true;
}

COMMAND:ginkla(playerid, params[])
{
	new weaponid, ammo;
    if(sscanf(params, "ii", weaponid, ammo)) SendClientMessage(playerid, COLOR_WHITE, "Komandos naudojimas: /ginkla [weapon id] [ammo]");
    else
    {
		GivePlayerWeapon(playerid, weaponid, ammo);
    }
	return true;
}

COMMAND:iginklus(playerid, params[])
{
    AC_ResetPlayerWeapons(playerid);
	return true;
}

COMMAND:iginkla(playerid, params[])
{
	new weaponid, ammo;
    if(sscanf(params, "ii", weaponid, ammo)) SendClientMessage(playerid, COLOR_WHITE, "Komandos naudojimas: /iginkla [weapon id] [ammo]");
    else
    {
		AC_GivePlayerWeapon(playerid, weaponid, ammo);
    }
	return true;
}

stock DebugWeapons(playerid)
{
	new tempWeapon[1][2];
	print("[AC] Starting weapons debug...");
    for (new i = 0; i < 13; i++)
    {
        GetPlayerWeaponData(playerid, i, tempWeapon[0][0], tempWeapon[0][1]);
        printf("[AC] Weapon slot id: %d, weapon id: %i, weapon ammo: %i", i, tempWeapon[0][0], tempWeapon[0][1]);
    }
    print("[AC] Finished weapons debug.");
}*/

stock AC_ResetPlayerWeapons(playerid, bool:connect = false)
{
    // *** WARNING: Reset weapons when connected ***
    CanCheck[playerid] = false;
    ResetPlayerWeapons(playerid);
    for (new i = 0; i < 13; i++)
    {
        if(connect) Weapons[playerid][i][0] = 0;
        Weapons[playerid][i][1] = 0;
	}
}

stock AC_NullPlayerWeapons(playerid)
{
	// *** WARNING: Null weapons before saving ***
    CanCheck[playerid] = false;
    for (new slotid = 0; slotid < 13; slotid++)
    {
        if(IsWeaponFireable(Weapons[playerid][slotid][0]) && Weapons[playerid][slotid][1] == 0) AC_RemovePlayerWeapon(playerid, slotid);
    }
}

stock AC_GivePlayerWeapon(playerid, weaponid, ammo)
{
	CanCheck[playerid] = false;
	new slotid = GetWeaponSlotByWepID(weaponid), finalAmmo = ammo;
	if(IsWeaponsInSameSlot(AC_GetPlayerWeaponIDFromSlot(playerid, slotid), weaponid)) finalAmmo += AC_GetPlayerWeaponAmmoFromSlot(playerid, slotid);
	if(IsWeaponFireable(weaponid) && finalAmmo == 0) Weapons[playerid][slotid][1] = 0;
	else
	{
		Weapons[playerid][slotid][0] = weaponid;
		Weapons[playerid][slotid][1] = finalAmmo;
	}
	GivePlayerWeapon(playerid, weaponid, ammo);
}

stock AC_RegivePlayerWeapons(playerid)
{
    CanCheck[playerid] = false;
    for (new slotid = 0; slotid < 13; slotid++)
    {
        GivePlayerWeapon(playerid, Weapons[playerid][slotid][0], Weapons[playerid][slotid][1]);
    }
}

forward AC_UpdatePlayerWeaponAmmo(playerid, slotid);
public AC_UpdatePlayerWeaponAmmo(playerid, slotid)
{
	new weaponid, ammo;
	GetPlayerWeaponData(playerid, slotid, weaponid, ammo);
	if(IsWeaponFireable(weaponid) && Weapons[playerid][slotid][0] == weaponid) Weapons[playerid][slotid][1] = ammo;
}

stock AC_RemovePlayerWeapon(playerid, slotid)
{
    Weapons[playerid][slotid][0] = 0;
	Weapons[playerid][slotid][1] = 0;
}

public OnPlayerUpdate(playerid)
{
	foreach(Player, i)
	{
	    if(Spawned[i])
	    {
	        if(!CanCheck[i]) CanCheck[i] = true;
			else
			{
			    if(GetPlayerWeapon(i) == 0)
			    {
			        for (new slotid = 0; slotid < 13; slotid++)
					{
					    AC_CheckPlayerWeapon(i, slotid);
					}
			    }
			    else AC_CheckPlayerWeapon(i);
			}
	    }
	}
	return true;
}

stock AC_CheckPlayerWeapon(playerid, slotid = -1)
{
	new tempWeapon[1][2];
	if(slotid == -1) slotid = GetWeaponSlotByWepID(GetPlayerWeapon(playerid));
	GetPlayerWeaponData(playerid, slotid, tempWeapon[0][0], tempWeapon[0][1]);
	if(tempWeapon[0][0] != 0)
	{
		if(tempWeapon[0][0] != AC_GetPlayerWeaponIDFromSlot(playerid, slotid) || (IsWeaponFireable(tempWeapon[0][0]) && tempWeapon[0][1] > AC_GetPlayerWeaponAmmoFromSlot(playerid, slotid)))
		{
			// kick
			printf("[ID:%i] is kicked for gun cheats", playerid);
			SendClientMessage(playerid, COLOR_WHITE, "KICKED");
			printf("[ID:%i] is kicked for gun cheats. Wep id %i, ammo %i, ac wep id %i, ammo %i", playerid, tempWeapon[0][0], tempWeapon[0][1], Weapons[playerid][slotid][0], Weapons[playerid][slotid][1]);
		}
		else if(IsWeaponFireable(tempWeapon[0][0]) && AC_GetPlayerWeaponAmmoFromSlot(playerid, slotid) > tempWeapon[0][1]) Weapons[playerid][slotid][1] = tempWeapon[0][1];
	}
}

stock GetWeaponSlotByWepID(weaponid)
{
	switch (weaponid)
	{
	    case 0, 1      : return 0;
	    case 2..9      : return 1;
		case 22..24    : return 2;
		case 25..27    : return 3;
		case 28, 29, 32: return 4;
		case 30, 31    : return 5;
		case 33, 34    : return 6;
		case 35..38    : return 7;
		case 16..19, 39: return 8;
		case 41..43    : return 9;
	    case 10..15    : return 10;
	    case 44..46    : return 11;
	    case 40        : return 12;
	}
	return -1;
}

stock IsWeaponFireable(weaponid)
{
	switch (weaponid)
	{
		case 0..15, 40, 44..46: return false;
	}
	return true;
}

stock IsWeaponsInSameSlot(oldweaponid, newweaponid)
{
	if(GetWeaponSlotByWepID(oldweaponid) == GetWeaponSlotByWepID(newweaponid)) return true;
	return false;
}

stock AC_GetPlayerWeaponIDFromSlot(playerid, slotid) return Weapons[playerid][slotid][0];

stock AC_GetPlayerWeaponAmmoFromSlot(playerid, slotid) return Weapons[playerid][slotid][1];
Sometimes, you get kick, when you fast scroll, with middle mouse weapons. How to make perfect gun, ammo anticheat?
Reply
#2

I don't have the time to look through that code -- but I'm going to assume two things. First, this code is not yours. Second, this code is not worth using if scrolling weapons in anyway provokes the server to kick you. Last time I checked, which given was around two years ago, scrolling weapons had nothing to do with any kind of present cheat. Look for something new.
Reply
#3

Maybe, it's not scroling, but if i get kick, for bad gun using, if am get it legit, i think somewhere is problem.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)