27.01.2014, 20:11
(
Последний раз редактировалось [FAT]Klabauter[LST]; 29.01.2014 в 16:15.
)
Ok, so i made this script to help admins find aimbot users. NOT TO KICK OR BAN THEM AUTOMATICALLY! They way it detects it is a comparison of the shots that a player fires and the shots that hit another moving player. I made 3 classes of weapons to test, each with different accuracy settings due to different firing rates. I have 2 versions, 1 for lag shooting servers, and 1 for non-lag shooting servers (only the non-lag shooting is tested). I think it's pretty reliable. If you spot any problems or ways to improve it please don't hesitate to post them, and keep in mind that I don't really know what I'm doing.
NOTE: the hit / miss ratio can be edited by changing the total2 value in each of the three weapon classes.
ex: for handguns, shotguns, snipers.
- "if(hitsA[issuerid] == 12)" is the amount of hits that it takes before the shots the player has fired are calculated.
- "if(total1A[issuerid] - total2A[issuerid] < 15)" is the amount of shots the player has taken.
- so that means that if the player hits the target 12 out of 14 shots he fails the test and the message is sent.
- if you change the number 15 to let's say 18, then if the player hits the target 12 out of 17 shots he fails the test.
- I noticed that on servers with no lag shooting a good player's accuracy will often be as good or better than aimbot
- I suggest using this on lag shooting servers, but do as you wish
UPDATE: added sniper and country rifle (I didn't know that you can aimbot with sniper )
LAG SHOOTING SERVERS
NON-LAG SHOOTING SERVERS
NOTE: the hit / miss ratio can be edited by changing the total2 value in each of the three weapon classes.
ex: for handguns, shotguns, snipers.
- "if(hitsA[issuerid] == 12)" is the amount of hits that it takes before the shots the player has fired are calculated.
- "if(total1A[issuerid] - total2A[issuerid] < 15)" is the amount of shots the player has taken.
- so that means that if the player hits the target 12 out of 14 shots he fails the test and the message is sent.
- if you change the number 15 to let's say 18, then if the player hits the target 12 out of 17 shots he fails the test.
- I noticed that on servers with no lag shooting a good player's accuracy will often be as good or better than aimbot
- I suggest using this on lag shooting servers, but do as you wish
UPDATE: added sniper and country rifle (I didn't know that you can aimbot with sniper )
LAG SHOOTING SERVERS
PHP код:
//This script is designed to help admins to detect when a player is using aimbot NOTE: also works on joypad users
//When aimbot users are detected a message will be sent to admins to spectate that player
//It is possible to get false positives (but rare) ex: player runs away in a straight line (LOL) and gets shot by another player that never misses
//I do not advise using kick or ban instead of the message, you don't want to punish good players do you?
//Use this script on any 0.3d or higher servers that have lag shooting
#include <a_samp>
#include <foreach>
#define red 0xFF0000AA
//#define TEST_MOVEMENT //uncomment this line to use debug, this will send a message to all players OnPlayerUpdate if they are "IN MOTION" or "STOPPED" (returns "STOPPED" in a vehicle)
new ammo1,
ammo2,
ammo3,
ammo4,
ammo5,
ammo6,
ammo7,
ammo8,
ammo9,
ammo10,
ammo11,
weapon,
total1A[MAX_PLAYERS],
total2A[MAX_PLAYERS],
total1B[MAX_PLAYERS],
total2B[MAX_PLAYERS],
total1C[MAX_PLAYERS],
total2C[MAX_PLAYERS],
hitsA[MAX_PLAYERS],
hitsB[MAX_PLAYERS],
hitsC[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
hitsA[playerid] = 0;
hitsB[playerid] = 0;
hitsC[playerid] = 0;
total1A[playerid] = 0;
total2A[playerid] = 0;
total1B[playerid] = 0;
total2B[playerid] = 0;
total1C[playerid] = 0;
total2C[playerid] = 0;
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
hitsA[playerid] = 0;
hitsB[playerid] = 0;
hitsC[playerid] = 0;
total1A[playerid] = 0;
total2A[playerid] = 0;
total1B[playerid] = 0;
total2B[playerid] = 0;
total1C[playerid] = 0;
total2C[playerid] = 0;
return 1;
}
public OnPlayerSpawn(playerid)
{
if(!IsPlayerConnected(playerid)) return 0;
hitsA[playerid] = 0;
hitsB[playerid] = 0;
hitsC[playerid] = 0;
total1A[playerid] = 0;
total2A[playerid] = 0;
total1B[playerid] = 0;
total2B[playerid] = 0;
total1C[playerid] = 0;
total2C[playerid] = 0;
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(!IsPlayerConnected(playerid)) return 0;
hitsA[playerid] = 0;
hitsB[playerid] = 0;
hitsC[playerid] = 0;
total1A[playerid] = 0;
total2A[playerid] = 0;
total1B[playerid] = 0;
total2B[playerid] = 0;
total1C[playerid] = 0;
total2C[playerid] = 0;
return 1;
}
public OnPlayerUpdate(playerid)
{
#if defined TEST_MOVEMENT
IsPlayerMoving(playerid);
#endif
return 1;
}
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
if(!IsPlayerConnected(issuerid)) return 0;
if(IsPlayerMoving(playerid) && hitsA[issuerid] == 0 && GetPlayerWeapon(issuerid) > 15 && GetPlayerWeapon(issuerid) < 28
|| IsPlayerMoving(playerid) && hitsA[issuerid] == 0 && GetPlayerWeapon(issuerid) > 32 && GetPlayerWeapon(issuerid) < 35) //handguns, shotguns, snipers
{
total1A[issuerid] = GetPlayerTotalAmmo(issuerid);
hitsA[issuerid] ++;
}
if(IsPlayerMoving(playerid) && hitsA[issuerid] > 0 && hitsA[issuerid] < 12 && GetPlayerWeapon(issuerid) > 15 && GetPlayerWeapon(issuerid) < 28)
{
hitsA[issuerid] ++;
}
if(hitsA[issuerid] == 12)
{
total2A[issuerid] = GetPlayerTotalAmmo(issuerid);
if(total1A[issuerid] - total2A[issuerid] < 15 && total1A[issuerid] - total2A[issuerid] >= 0)
{
new name[MAX_PLAYER_NAME], string[192];
GetPlayerName(issuerid,name,sizeof(name));
hitsA[issuerid] = 0;
format(string, sizeof string, "{FF7D7D}[ATTENTION] {FF0000}%s {FF7D7D}id{FF0000}[%d] {FF7D7D}Needs to be spectated, {FF0000}Reason: {FF7D7D}POSSIBLE AIMBOT.", name, issuerid);
foreach (new i : Player)
{
if(IsPlayerAdmin(i)) SendClientMessage(i,red,string); //will send to rcon admins unless you edit it for your admin script
}
}
else
{
hitsA[issuerid] = 0;
}
}
if(IsPlayerMoving(playerid) && hitsB[issuerid] == 0 && GetPlayerWeapon(issuerid) == 28
|| IsPlayerMoving(playerid) && hitsB[issuerid] == 0 && GetPlayerWeapon(issuerid) == 32) //tec 9 and uzi
{
total1B[issuerid] = GetPlayerTotalAmmo(issuerid);
hitsB[issuerid] ++;
}
if(IsPlayerMoving(playerid) && hitsB[issuerid] > 0 && hitsB[issuerid] < 26 && GetPlayerWeapon(issuerid) == 28
|| IsPlayerMoving(playerid) && hitsB[issuerid] > 0 && hitsB[issuerid] < 26 && GetPlayerWeapon(issuerid) == 32)
{
hitsB[issuerid] ++;
}
if(hitsB[issuerid] == 26)
{
total2B[issuerid] = GetPlayerTotalAmmo(issuerid);
if(total1B[issuerid] - total2B[issuerid] < 30 && total1B[issuerid] - total2B[issuerid] >= 0)
{
new name[MAX_PLAYER_NAME], string[192];
GetPlayerName(issuerid,name,sizeof(name));
hitsB[issuerid] = 0;
format(string, sizeof string, "{FF7D7D}[ATTENTION] {FF0000}%s {FF7D7D}id{FF0000}[%d] {FF7D7D}Needs to be spectated, {FF0000}Reason: {FF7D7D}POSSIBLE AIMBOT.", name, issuerid);
foreach (new i : Player)
{
if(IsPlayerAdmin(i)) SendClientMessage(i,red,string); //will send to rcon admins unless you edit it for your admin script
}
}
else
{
hitsB[issuerid] = 0;
}
}
if(IsPlayerMoving(playerid) && hitsC[issuerid] == 0 && GetPlayerWeapon(issuerid) > 28 && GetPlayerWeapon(issuerid) < 32) //MP5, AK47, M4
{
total1C[issuerid] = GetPlayerTotalAmmo(issuerid);
hitsC[issuerid] ++;
}
if(IsPlayerMoving(playerid) && hitsC[issuerid] > 0 && hitsC[issuerid] < 20 && GetPlayerWeapon(issuerid) > 28 && GetPlayerWeapon(issuerid) < 32)
{
hitsC[issuerid] ++;
}
if(hitsC[issuerid] == 20)
{
total2C[issuerid] = GetPlayerTotalAmmo(issuerid);
if(total1C[issuerid] - total2C[issuerid] < 23 && total1C[issuerid] - total2C[issuerid] >= 0)
{
new name[MAX_PLAYER_NAME], string[192];
GetPlayerName(issuerid,name,sizeof(name));
hitsC[issuerid] = 0;
format(string, sizeof string, "{FF7D7D}[ATTENTION] {FF0000}%s {FF7D7D}id{FF0000}[%d] {FF7D7D}Needs to be spectated, {FF0000}Reason: {FF7D7D}POSSIBLE AIMBOT.", name, issuerid);
foreach (new i : Player)
{
if(IsPlayerAdmin(i)) SendClientMessage(i,red,string); //will send to rcon admins unless you edit it for your admin script
}
}
else
{
hitsC[issuerid] = 0;
}
}
return 1;
}
stock IsPlayerMoving(playerid)
{
new Float:Velocity[3];
GetPlayerVelocity(playerid, Velocity[0], Velocity[1], Velocity[2]);
if(Velocity[0] >= 0.02
|| Velocity[1] >= 0.02
|| Velocity[2] >= 0.02
|| Velocity[0] <= -0.02
|| Velocity[1] <= -0.02 //set at 0.02 and -0.02 will detect any on foot movement faster than standing on an escalator
|| Velocity[2] <= -0.02) //set at 0.07 and -0.07 will detect any on foot movement faster than walking or strafing (running)
{
#if defined TEST_MOVEMENT
SendClientMessage(playerid, -1, "IN MOTION");
#endif
return true;
}
else
{
#if defined TEST_MOVEMENT
SendClientMessage(playerid, red, "STOPPED");
#endif
return false;
}
}
stock GetPlayerTotalAmmo(playerid) //fist and melee weaps excluded
{
new totalammo;
GetPlayerWeaponData(playerid, 2, weapon, ammo1);
GetPlayerWeaponData(playerid, 3, weapon, ammo2);
GetPlayerWeaponData(playerid, 4, weapon, ammo3);
GetPlayerWeaponData(playerid, 5, weapon, ammo4);
GetPlayerWeaponData(playerid, 6, weapon, ammo5);
GetPlayerWeaponData(playerid, 7, weapon, ammo6);
GetPlayerWeaponData(playerid, 8, weapon, ammo7);
GetPlayerWeaponData(playerid, 9, weapon, ammo8);
GetPlayerWeaponData(playerid, 11, weapon, ammo9);
GetPlayerWeaponData(playerid, 12, weapon, ammo10);
GetPlayerWeaponData(playerid, 13, weapon, ammo11);
totalammo = ammo1+ammo2+ammo3+ammo4+ammo5+ammo6+ammo7+ammo8+ammo9+ammo10+ammo11;
return totalammo;
}
PHP код:
//This script is designed to help admins to detect when a player is using aimbot NOTE: also works on joypad users
//When aimbot users are detected a message will be sent to admins to spectate that player
//It is possible to get false positives (but rare) ex: player runs away in a straight line (LOL) and gets shot by another player that never misses
//I do not advise using kick or ban instead of the message, you don't want to punish good players do you?
//Use this script on 0.3z servers or any servers 0.3d or higher that have no lag shooting
//Remember to add "bodypart" to OnPlayerGiveDamage for 0.3z servers
#include <a_samp>
#include <foreach>
#define red 0xFF0000AA
//#define TEST_MOVEMENT //uncomment this line to use debug, this will send a message to all players OnPlayerUpdate if they are "IN MOTION" or "STOPPED" (returns "STOPPED" in a vehicle)
new ammo1,
ammo2,
ammo3,
ammo4,
ammo5,
ammo6,
ammo7,
ammo8,
ammo9,
ammo10,
ammo11,
weapon,
total1A[MAX_PLAYERS],
total2A[MAX_PLAYERS],
total1B[MAX_PLAYERS],
total2B[MAX_PLAYERS],
total1C[MAX_PLAYERS],
total2C[MAX_PLAYERS],
hitsA[MAX_PLAYERS],
hitsB[MAX_PLAYERS],
hitsC[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
hitsA[playerid] = 0;
hitsB[playerid] = 0;
hitsC[playerid] = 0;
total1A[playerid] = 0;
total2A[playerid] = 0;
total1B[playerid] = 0;
total2B[playerid] = 0;
total1C[playerid] = 0;
total2C[playerid] = 0;
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
hitsA[playerid] = 0;
hitsB[playerid] = 0;
hitsC[playerid] = 0;
total1A[playerid] = 0;
total2A[playerid] = 0;
total1B[playerid] = 0;
total2B[playerid] = 0;
total1C[playerid] = 0;
total2C[playerid] = 0;
return 1;
}
public OnPlayerSpawn(playerid)
{
if(!IsPlayerConnected(playerid)) return 0;
hitsA[playerid] = 0;
hitsB[playerid] = 0;
hitsC[playerid] = 0;
total1A[playerid] = 0;
total2A[playerid] = 0;
total1B[playerid] = 0;
total2B[playerid] = 0;
total1C[playerid] = 0;
total2C[playerid] = 0;
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(!IsPlayerConnected(playerid)) return 0;
hitsA[playerid] = 0;
hitsB[playerid] = 0;
hitsC[playerid] = 0;
total1A[playerid] = 0;
total2A[playerid] = 0;
total1B[playerid] = 0;
total2B[playerid] = 0;
total1C[playerid] = 0;
total2C[playerid] = 0;
return 1;
}
public OnPlayerUpdate(playerid)
{
#if defined TEST_MOVEMENT
IsPlayerMoving(playerid);
#endif
return 1;
}
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid)
{
if(!IsPlayerConnected(playerid)) return 0;
if(IsPlayerMoving(damagedid) && hitsA[playerid] == 0 && GetPlayerWeapon(playerid) > 15 && GetPlayerWeapon(playerid) < 28
|| IsPlayerMoving(damagedid) && hitsA[playerid] == 0 && GetPlayerWeapon(playerid) > 32 && GetPlayerWeapon(playerid) < 35) //handguns, shotguns, snipers
{
total1A[playerid] = GetPlayerTotalAmmo(playerid);
hitsA[playerid] ++;
}
if(IsPlayerMoving(damagedid) && hitsA[playerid] > 0 && hitsA[playerid] < 12 && GetPlayerWeapon(playerid) > 15 && GetPlayerWeapon(playerid) < 28)
{
hitsA[playerid] ++;
}
if(hitsA[playerid] == 12)
{
total2A[playerid] = GetPlayerTotalAmmo(playerid);
if(total1A[playerid] - total2A[playerid] < 15 && total1A[playerid] - total2A[playerid] >= 0)
{
new name[MAX_PLAYER_NAME], string[192];
GetPlayerName(playerid,name,sizeof(name));
hitsA[playerid] = 0;
format(string, sizeof string, "{FF7D7D}[ATTENTION] {FF0000}%s {FF7D7D}id{FF0000}[%d] {FF7D7D}Needs to be spectated, {FF0000}Reason: {FF7D7D}POSSIBLE AIMBOT.", name, playerid);
foreach (new i : Player)
{
if(IsPlayerAdmin(i)) SendClientMessage(i,red,string); //will send to rcon admins unless you edit it for your admin script
}
}
else
{
hitsA[playerid] = 0;
}
}
if(IsPlayerMoving(damagedid) && hitsB[playerid] == 0 && GetPlayerWeapon(playerid) == 28
|| IsPlayerMoving(damagedid) && hitsB[playerid] == 0 && GetPlayerWeapon(playerid) == 32) //tec 9 and uzi
{
total1B[playerid] = GetPlayerTotalAmmo(playerid);
hitsB[playerid] ++;
}
if(IsPlayerMoving(damagedid) && hitsB[playerid] > 0 && hitsB[playerid] < 26 && GetPlayerWeapon(playerid) == 28
|| IsPlayerMoving(damagedid) && hitsB[playerid] > 0 && hitsB[playerid] < 26 && GetPlayerWeapon(playerid) == 32)
{
hitsB[playerid] ++;
}
if(hitsB[playerid] == 26)
{
total2B[playerid] = GetPlayerTotalAmmo(playerid);
if(total1B[playerid] - total2B[playerid] < 30 && total1B[playerid] - total2B[playerid] >= 0)
{
new name[MAX_PLAYER_NAME], string[192];
GetPlayerName(playerid,name,sizeof(name));
hitsB[playerid] = 0;
format(string, sizeof string, "{FF7D7D}[ATTENTION] {FF0000}%s {FF7D7D}id{FF0000}[%d] {FF7D7D}Needs to be spectated, {FF0000}Reason: {FF7D7D}POSSIBLE AIMBOT.", name, playerid);
foreach (new i : Player)
{
if(IsPlayerAdmin(i)) SendClientMessage(i,red,string); //will send to rcon admins unless you edit it for your admin script
}
}
else
{
hitsB[playerid] = 0;
}
}
if(IsPlayerMoving(damagedid) && hitsC[playerid] == 0 && GetPlayerWeapon(playerid) > 28 && GetPlayerWeapon(playerid) < 32) //MP5, AK47, M4
{
total1C[playerid] = GetPlayerTotalAmmo(playerid);
hitsC[playerid] ++;
}
if(IsPlayerMoving(damagedid) && hitsC[playerid] > 0 && hitsC[playerid] < 20 && GetPlayerWeapon(playerid) > 28 && GetPlayerWeapon(playerid) < 32)
{
hitsC[playerid] ++;
}
if(hitsC[playerid] == 20)
{
total2C[playerid] = GetPlayerTotalAmmo(playerid);
if(total1C[playerid] - total2C[playerid] < 23 && total1C[playerid] - total2C[playerid] >= 0)
{
new name[MAX_PLAYER_NAME], string[192];
GetPlayerName(playerid,name,sizeof(name));
hitsC[playerid] = 0;
format(string, sizeof string, "{FF7D7D}[ATTENTION] {FF0000}%s {FF7D7D}id{FF0000}[%d] {FF7D7D}Needs to be spectated, {FF0000}Reason: {FF7D7D}POSSIBLE AIMBOT.", name, playerid);
foreach (new i : Player)
{
if(IsPlayerAdmin(i)) SendClientMessage(i,red,string); //will send to rcon admins unless you edit it for your admin script
}
}
else
{
hitsC[playerid] = 0;
}
}
return 1;
}
stock IsPlayerMoving(playerid)
{
new Float:Velocity[3];
GetPlayerVelocity(playerid, Velocity[0], Velocity[1], Velocity[2]);
if(Velocity[0] >= 0.02
|| Velocity[1] >= 0.02
|| Velocity[2] >= 0.02
|| Velocity[0] <= -0.02
|| Velocity[1] <= -0.02 //set at 0.02 and -0.02 will detect any on foot movement faster than standing on an escalator
|| Velocity[2] <= -0.02) //set at 0.07 and -0.07 will detect any on foot movement faster than walking or strafing (running)
{
#if defined TEST_MOVEMENT
SendClientMessage(playerid, -1, "IN MOTION");
#endif
return true;
}
else
{
#if defined TEST_MOVEMENT
SendClientMessage(playerid, red, "STOPPED");
#endif
return false;
}
}
stock GetPlayerTotalAmmo(playerid) //fist and melee weaps excluded
{
new totalammo;
GetPlayerWeaponData(playerid, 2, weapon, ammo1);
GetPlayerWeaponData(playerid, 3, weapon, ammo2);
GetPlayerWeaponData(playerid, 4, weapon, ammo3);
GetPlayerWeaponData(playerid, 5, weapon, ammo4);
GetPlayerWeaponData(playerid, 6, weapon, ammo5);
GetPlayerWeaponData(playerid, 7, weapon, ammo6);
GetPlayerWeaponData(playerid, 8, weapon, ammo7);
GetPlayerWeaponData(playerid, 9, weapon, ammo8);
GetPlayerWeaponData(playerid, 11, weapon, ammo9);
GetPlayerWeaponData(playerid, 12, weapon, ammo10);
GetPlayerWeaponData(playerid, 13, weapon, ammo11);
totalammo = ammo1+ammo2+ammo3+ammo4+ammo5+ammo6+ammo7+ammo8+ammo9+ammo10+ammo11;
return totalammo;
}