08.12.2011, 06:06
Короче, сделал я этот античит и заметил, что опять разработчик сампа нам преподнёс ф-ию, про которую из-за своей баганутости можно забыть.
Речь пойдёт про новые ф-ии OnPlayerGiveDamag и OnPlayerTakeDamage.
Выкладываю весь античит, т.к. есть ложные срабатывания. Может общими мозгами получится доработать.
Какие будут предложения?
Речь пойдёт про новые ф-ии OnPlayerGiveDamag и OnPlayerTakeDamage.
Выкладываю весь античит, т.к. есть ложные срабатывания. Может общими мозгами получится доработать.
pawn Код:
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{ //вызывается когда игрок playerid наносит урон игроку damagedid
if(playerid == INVALID_PLAYER_ID) return 1;//исключения на всякий случай
if(damagedid == INVALID_PLAYER_ID) return 1;//исключения на всякий случай
if(!ANTIGODMOD) return 1;//отбрасываем проверку кода, если Античит выключен
if(GetPVarInt(damagedid, "IsPlayerControllable") != 0 ) return 1;//отбрасываем случаи если игрок был замарожен
if(amount < 2.0) return 1;//отбрасываем случаи ударов кулаком
if(AFK_IdleTime[damagedid] >= 3) return 1;//отбрасываем случаи если игрок был АФК
//ИНФОРМИРОВАНИЕ
new string[MAX_STRING];
new Float:health; GetPlayerHealth(damagedid, health);
format(string, sizeof(string), "%s give %.1f damage to %s, weapon: %s (LastHealth:%.1f)",
PlayerName(playerid), amount, PlayerName(damagedid), WeaponName(weaponid),
health);
SendClientMessageToAll(COLOR_GREEN, string);
WaitDetected[damagedid] = 2;//сделали задержку на 2 срабатывания проверки античита
DetectedGiveDamage[damagedid] = floatround(amount);
return 1;
}
public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid) //при год моде и АФК не вызывается
{ //вызывается когда игрок playerid получает урон от игрока issuerid
//всегда вызывается после OnPlayerGiveDamage
if(playerid == INVALID_PLAYER_ID) return 1;
if(issuerid == INVALID_PLAYER_ID) return 1;
if(!ANTIGODMOD) return 1;
if(amount < 2.0) return 1;
//if(GetPVarInt(playerid, "IsPlayerControllable") != 0 ) return 1;//при замарозке не вызывается
//if(AFK_IdleTime[playerid] >= 3) return 1;//при АФК не вызывается
DetectedGiveDamage[playerid] = 0;//обнулили, проверка закончена. Игрок чист.
//ИНФОРМИРОВАНИЕ
new string[MAX_STRING];
new Float:health; GetPlayerHealth(playerid, health);
format(string, sizeof(string), "%s take %.1f damage from %s, weapon: %s (LastHealth:%.1f)",
PlayerName(playerid), amount, PlayerName(issuerid), WeaponName(weaponid),
health);
SendClientMessageToAll(COLOR_RED, string);
return 1;
}
//САМ АНТИЧИТ
public OnPlayerUpdate(playerid)
{
WaitDetected[playerid]--;
if(DetectedGiveDamage[playerid] != 0 && WaitDetected[playerid] <= 0)
{
new string[MAX_STRING];
format(string, sizeof(string), "AdmWarning: %s[%d]. Подозрение на бессмертие (GiveDamage:%d)",
PlayerName(playerid), playerid, DetectedGiveDamage[playerid]);
SendAdminMessage(ADMINS_MESSAGE_COLOR, string, 3);
DetectedGiveDamage[playerid] = 0;//останавливаем флуд в чат
WaitDetected[playerid] = 0;
}
return 1;
}