Привет! Это мой первый собственный сценарий. Ее серверным античит (не готовы на все)
В настоящее время она имеет только следующие функции:
* Основные анти здоровья обмануть * Основные борьбе брони обмануть * Airbreak обнаружения использованием MapAndreas карты высот * Anti Speedhack * Anti Jetpack
И он задерживается системы запрет, потому что я думаю, что это делает работу мошенников сложнее, когда они не знать, какие рубить вызвало запрет. Я был бы признателен, если Вы можете проверить особенно airbreak обнаружения.
Херес источника (требуется mapandreas)
Code
/** / AHX (AntiHax) Server-side anticheat for SA:MP - Early version / Copyright (C) 2011 Duxtray / YOU ARE ALLOWED TO USE THIS SCRIPT / YOU ARE NOT ALLOWED TO REMOVE OR CHANGE CREDITS OF THIS SCRIPT / YOU ARE NOT ALLOWED TO CHANGE SCRIPT'S NAME (ANTIHAX) / YOU ARE NOT ALLOWED TO TAKE ANY CHEAT DETECTION SYSTEM DIRECTLY FROM THIS SCRIPT AND CLAIM IT AS YOURS **/ #include <a_samp> #include <mapandreas>
// PROTECTION SETTINGS #define HEALTH true // anti health hack
#define HEALTH_SCORE 3 // violation score from hack //////////////////////////////
#define ARMOUR true // anti armour hack
#define ARMOUR_SCORE 3 // violation score from hack //////////////////////////////
#define JETPACK true // dont allow jetpack usage
#define JETPACK_SCORE 3 // violation score from hack //////////////////////////////
#define AIRBREAK true // anti airbreak hack
#define AIRBREAK_SCORE 3 // violation score from hack
#define AIRBREAK_TRESHOLD 5.0 // minimal difference in height between player and ground to activate airbreak check //////////////////////////////
#define SPEEDHACK true // speedhack detection
#define SPEEDHACK_SCORE 3 // violation score
#define SH_VEHICLE_SPEED_MAX 300.0 // maximum speed of vehicle before treating as speedhacker
#define SH_PLAYER_SPEED_MAX 50.0 // maximum speed of player on foot before treating as speedhacker //////////////////////////////
//////////////////////////////
// GENERAL SETTINGS
#define QUIET true // dont show any reason in bans/kicks (increases effectivity? cheaters dont know which hack was detected)
// Global variables and declarations new ahx_playerWarningScore[MAX_PLAYERS]; new ahx_skipPlayer[MAX_PLAYERS]; new ahx_playerAirbreakMode[MAX_PLAYERS]; new ahx_playerIP[MAX_PLAYERS][40];
public OnPlayerConnect(playerid) { new ip[40]; GetPlayerIp(playerid, ip, 16); ahx_playerIP[playerid] = ip; ahx_PlayerMessage(playerid, "This server is protected by AntiHax"); return 1; }
public OnPlayerDisconnect(playerid, reason) { if (reason == 2) { ahx_playerIP[playerid][0] = 0; return 1; /* own kick/ban */ } if (ahx_playerWarningScore[playerid] >= BAN_SCORE) { new message[100]; format(message, sizeof(message), "%s: Banned (-)", ahx_PlayerName(playerid)); ahx_PlayerMessageToEveryone(message); print(message);
for (new i = 0 ; i < MAX_PLAYERS ; i++) { if (!IsPlayerConnected(i)) continue; if (ahx_skipPlayer[i]) continue; if (IsPlayerAdmin(i) && ADMIN_IMMUNITY) continue;
// HEALTH if (HEALTH) { new Float:health; GetPlayerHealth(i, health); if (health > 100.0) { ahx_TakeAction(i, "Health hack", HEALTH_SCORE); } }
// ARMOR if (ARMOUR) { new Float:armour; GetPlayerArmour(i, armour); if (armour > 100.0) { ahx_TakeAction(i, "Armour hack", ARMOUR_SCORE); } }
if (zDiff > AIRBREAK_TRESHOLD) { if (GetPlayerState(i) != PLAYER_STATE_WASTED) { // dont proceed if dying if (GetPlayerInterior(i) == 0) { // only proceed when at main world if (IsPlayerInAnyVehicle(i)) { ahx_playerAirbreakMode[i] = 1; if (!ahx_IsVehicleAirVehicle(GetVehicleModel(GetPlayerVehicleID(i)))) { // wont proceed if inside air vehicle if (GetPlayerState(i) == PLAYER_STATE_DRIVER) { // dont ban passengers (innocent?) ahx_AirBreakCheck(i); } } } else {
// on foot and flying? if(GetPlayerSpecialAction(i) != SPECIAL_ACTION_USEJETPACK) { ahx_playerAirbreakMode[i] = 0; ahx_AirBreakCheck(i); } } } } } }
/ / SPEEDHACK if (SPEEDHACK) { new Float:vPlayer; vPlayer = ahx_GetPlayerSpeed(i, false); if (IsPlayerInAnyVehicle(i)) { if (vPlayer > SH_VEHICLE_SPEED_MAX) { ahx_TakeAction(i, "Speedhack", SPEEDHACK_SCORE); } } else { if (vPlayer > SH_PLAYER_SPEED_MAX) { ahx_TakeAction(i, "Speedhack", SPEEDHACK_SCORE); } }
/* ahx_TakeAction: Kicks/bans/warns player */ stock ahx_TakeAction(playerid, reason[], score) { if (IsPlayerConnected(playerid)) {
ahx_playerWarningScore[playerid] += score;
if (QUIET) { reason[0] = '-'; reason[1] = 0; } if (DELAYED && ahx_playerWarningScore[playerid] > WARN_SCORE) { new rand = MIN_DELAY+random(MAX_DELAY-MIN_DELAY); SetTimerEx("ahx_DelayedAction", rand*1000, false, "iss",playerid, ahx_PlayerName(playerid), reason); ahx_skipPlayer[playerid] = true; return; } if (ahx_playerWarningScore[playerid] >= BAN_SCORE) {
new message[100]; format(message, sizeof(message), "You have been banned (%s)", reason); ahx_PlayerMessage(playerid, message); new gmessage[100]; format(gmessage, sizeof(gmessage), "%s: Banned (%s)", ahx_PlayerName(playerid), reason); ahx_PlayerMessageToEveryone(gmessage); Ban(playerid); ahx_playerWarningScore[playerid] = 0; return;
} if (ahx_playerWarningScore[playerid] >= KICK_SCORE) {
new message[100]; format(message, sizeof(message), "You have been kicked (%s)", reason); ahx_PlayerMessage(playerid, message);
new gmessage[100]; format(gmessage, sizeof(gmessage), "%s: Kicked (%s)", ahx_PlayerName(playerid), reason); ahx_PlayerMessageToEveryone(gmessage); Kick(playerid); return; } if (ahx_playerWarningScore[playerid] >= WARN_SCORE) { new message[100]; format(message, sizeof(message), "Warning! Do not violate rules (%s)", reason); ahx_PlayerMessage(playerid, message); return; }
} }
public ahx_DelayedAction(playerid, playername[], reason[]) { if (strcmp(playername, ahx_PlayerName(playerid)) != 0) { // cheater disconnected before this ?! lets not ban innocent people return; } if (ahx_playerWarningScore[playerid] >= BAN_SCORE) {
new message[100]; format(message, sizeof(message), "You have been banned (%s)", reason); ahx_PlayerMessage(playerid, message); new gmessage[100]; format(gmessage, sizeof(gmessage), "%s: Banned (%s)", ahx_PlayerName(playerid), reason); ahx_PlayerMessageToEveryone(gmessage); Ban(playerid); ahx_playerWarningScore[playerid] = 0; return; } if (ahx_playerWarningScore[playerid] >= KICK_SCORE) {
new message[100]; format(message, sizeof(message), "You have been kicked (%s)", reason); ahx_PlayerMessage(playerid, message);
new gmessage[100]; format(gmessage, sizeof(gmessage), "%s: Kicked (%s)", ahx_PlayerName(playerid), reason); ahx_PlayerMessageToEveryone(gmessage); Kick(playerid); return; } if (ahx_playerWarningScore[playerid] >= WARN_SCORE) { new message[100]; format(message, sizeof(message), "Warning! Do not violate rules (%s)", reason); ahx_PlayerMessage(playerid, message); return; } }
/* ahx_PlayerMessage: Send message to player */ stock ahx_PlayerMessage(playerid, message[]) { if (IsPlayerConnected(playerid)) { new msg[100]; format(msg, sizeof(msg), "%s: %s", MESSAGE_PREFIX, message); SendClientMessage(playerid, C_GREEN, msg); } }
/* ahx_PlayerMessageToEveryone: Send message to all players */ stock ahx_PlayerMessageToEveryone(message[]) { new msg[100]; format(msg, sizeof(msg), "%s: %s", MESSAGE_PREFIX, message); SendClientMessageToAll(C_GREEN, msg); } /* ahx_BubbleSort: Sort array with bubble sort algorithm*/ stock ahx_BubbleSort(Float:array[], length) { new i,j; for(i=0 ; i<length ; i++) { for(j=0 ; j<i ; j++) { if(array[i]>array[j]) { new Float:temp=array[i]; array[i]=array[j]; array[j]=temp; }
}
} }
/* ahx_PlayerName: Get player name easily */ stock ahx_PlayerName(playerid) { new name[MAX_PLAYER_NAME]; GetPlayerName(playerid, name, sizeof(name)); return name; } /* ahx_GetHighestZFor2DCoord: Get Z coordinate for ground at specified point with MapAndreas but detect whether coordinate for ex. edge of roof */ stock Float:ahx_GetHighestZFor2DCoord(Float:x, Float:y) { new Float:coords[5], Float:temp;
ahx_BubbleSort(coords,5); new Float:result = coords[0]; return result; } /* ahx_GetLowestZFor2DCoord: Get Z coordinate for ground at specified point with MapAndreas but detect whether coordinate for ex. edge of roof */ stock Float:ahx_GetLowestZFor2DCoord(Float:x, Float:y) { new Float:coords[5], Float:temp;