PDA

Просмотр полной версии : [Античит] [Вопрос] AntiHealth и AntiArmour



gangzone.ini
30.05.2015, 14:15
Правильно сделан античит на хп и броню ?
Если буду выдавать хп и броню через SetPlayerArmourEx и SetPlayerHealthEx, а если читер начитерит у него не получится?


new Float:anti_armour[MAX_PLAYERS];
new Float:anti_health[MAX_PLAYERS];

SetTimer("AntiCheat",1000, 1);

public AntiCheat()
{
foreach(new i: Player)
{
//AntiArmour
new Float: Armour, Float: Health;
GetPlayerArmour(i, Armour);
if(anti_armour[i] < Armour)
{
SetPlayerArmour(i, anti_armour[i]);
}
else
anti_armour[i] = Armour;
//AntiHealth
GetPlayerArmour(i, Health);
if(anti_health[i] < Health)
{
SetPlayerArmour(i, anti_health[i]);
}
else
anti_health[i] = Health;
}
return true;
}

stock SetPlayerArmorAC(playerid, Float: Armor)
{
anti_armour[playerid] = Armor;
SetPlayerArmour(playerid, Armor);
return true;
}

stock SetPlayerHealthAC(playerid, Float: Health)
{
anti_health[playerid] = Health;
SetPlayerHealth(playerid, Health);
return true;
}

$continue$
30.05.2015, 15:27
Для кого Стас (Daniel Cortez) писал уроки про перехваты?


stock ac_hp__SetPlayerHealth(playerid, &Float:health)
{
anti_health[playerid] = health;
return SetPlayerHealth(playerid, health);
}
#if defined _ALS_SetPlayerHealth
#undef SetPlayerHealth
#else
#define _ALS_SetPlayerHealth
#endif
#define SetPlayerHealth ac_hp__SetPlayerHealth



stock ac_armour__SetPlayerArmour(playerid, &Float:armour)
{
anti_armour[playerid] = armour;
return SetPlayerArmour(playerid, armour);
}
#if defined _ALS_SetPlayerArmour
#undef SetPlayerArmour
#else
#define _ALS_SetPlayerArmour
#endif
#define SetPlayerArmour ac_armour__SetPlayerArmour

Ну а так, не разрабатываю анти читы, но возможно алгоритм верный судя всему по коду.

gangzone.ini
30.05.2015, 15:45
Использовала код для меня понятный)

Daniel_Cortez
30.05.2015, 17:49
1. Вместо ХП второй раз подряд проверяете броню.

2. Создание переменных Armour и Health лучше вынести за пределы цикла, иначе они будут создаваться заново на каждой итерации.

3. Переменные вещественного типа лучше сравнивать с помощью floatcmp (http://pro-pawn.ru/showthread.php?12323-floatcmp), иначе будут потери в производительности (ладно бы один раз, но тут у нас цикл по всем игрокам).


GetPlayerArmour(i, armour);
new result = floatcmp(armour, anti_armour[i]);
if(result == 1) // если ХП больше записанного значения
SetPlayerArmour(i, anti_armour[i]);
elseif(result == -1) // если ХП меньше записанного значения (при равенстве не нужно ничего делать)
anti_armour[i] = armour;


4. Если выдать игроку ХП, новое значение сразу же будет записано в anti_armour[playerid], а у игрока оно обновится не сразу, а через некоторое время (от 100 мс, зависит от пинга).
Если в этот небольшой промежуток времени произойдёт проверка ХП, будет ложное срабатывание и античит установит у игрока прежнее ХП, которое было до вызова SetPlayerArmorAC.
Поэтому после выдачи ХП нужно некоторое время пропускать проверку ХП у игрока.
Подробное решение можно найти в моей статье по перехватам:

http://pro-pawn.ru/showthread.php?10611