Alexandr Bochkarev
Ученик
Сразу хочу предупредить, что объяснять доходчиво и понятно для новичков я не умею. Если вы новичок и хотите эту "классную хичу" себе на сервер, но не понимаете суть темы - либо уходите, либо изучайте.
[HR][/HR]
От автора: Система сделана исключительно как на SAMP-RP или на подобии как на SAMP-RP так что и количество наносимого дамага с разного оружия будет в точности как на SAMP-RP. Что есть в этой системе:
- АнтиГМ от пуль;
- Античит на выстрел несуществующих патрон (не контрится, можно считать как античит на оружие и патроны, 2 в 1);
- Античит на ХП и броню;
Описание мануала: делаем собственную систему дамага от пуль, тем самым блокируем любые античиты на гм от пуль.
Ну вот, вступительная часть подошла к концу.
[HR][/HR]
История версий:
0.1 - Написана система
0.2 - Система улучшена (теперь не контриться NOPом SetPlayerHealth), античит на хп, античит на броню, добавлено снятие брони при выдачи дамага игроку, проверка на афк.
0.3 - Исправление недоработки системы, в частности снятие брони без хп и возможность убить 2 раза. Спасибо ему (
[HR][/HR]
Ко всем new
Ко всем stock добавим новые функции
Создадим свой паблик для обработки смерти от пуль. В чем его преимущество - даже если читер будет блокировать смерть , паблик все равно будет вызываться. Туда вы можете добавить все обычные функции из OnPlayerDeath
В OnPlayerConnect
В public OnPlayerWeaponShot вставляем перехват выстрелов и дамага с них
В public OnPlayerSpawn добавляем
В public PlayerUpdate (секундный индивидуальный таймер. если у вас нету такового, то ниже будет ссылочка на готовый урок)
[HR][/HR]
Сразу хочу сказать, что некоторые моменты не доделаны и возможно будут мною исправлены позже (лень).
Система опубликована только для ознакомления, с помощью нее вы можете написать себе много классных античитов, систему прокачки скиллов, а может даже свою систему дамага с проверкой на навык владения оружием игрока и проверку на часть тела, в которую летела пуля. Дерзайте, все в ваших руках.
С вами был автор иследований и мануала iMaddy (Alexandr Bochkarev).
[HR][/HR]
От автора: Система сделана исключительно как на SAMP-RP или на подобии как на SAMP-RP так что и количество наносимого дамага с разного оружия будет в точности как на SAMP-RP. Что есть в этой системе:
- АнтиГМ от пуль;
- Античит на выстрел несуществующих патрон (не контрится, можно считать как античит на оружие и патроны, 2 в 1);
- Античит на ХП и броню;
Описание мануала: делаем собственную систему дамага от пуль, тем самым блокируем любые античиты на гм от пуль.
Ну вот, вступительная часть подошла к концу.
[HR][/HR]
История версий:
0.1 - Написана система
0.2 - Система улучшена (теперь не контриться NOPом SetPlayerHealth), античит на хп, античит на броню, добавлено снятие брони при выдачи дамага игроку, проверка на афк.
0.3 - Исправление недоработки системы, в частности снятие брони без хп и возможность убить 2 раза. Спасибо ему (
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
) за то, что сообщил об этом.[HR][/HR]
Ко всем new
Код:
new pAmmo[MAX_PLAYERS][13];
new Float:pHealth[MAX_PLAYERS];
new Float:pArmor[MAX_PLAYERS];
new HWarning[MAX_PLAYERS];
new AWarning[MAX_PLAYERS];
new bool:Killed[MAX_PLAYERS];
Ко всем stock добавим новые функции
1) Функция выдачи оружия сервером. Можете совместить со своей функцией
2) Функции выдачи дамага игроку и обработка дамага
3) Функция GetWeaponSlot (получает слот оружия по его иду)
4) Функция выдачи ХП сервером (для античита)
5) Функция выдачи брони сервером (для античита)
Код:
stock GivePlayerWeaponAC(playerid,weaponid,ammo)
{
pAmmo[playerid][GetWeaponSlot(weaponid)] += ammo;
GivePlayerWeapon(playerid,weaponid,ammo);
return 1;
}
Код:
stock ArmorDamage(playerid,attackerid,weaponid,Float:ammount)
{
if(pArmor[playerid] <= 0)
return false;
if(pArmor[playerid] - ammount <= 0)
SetPlayerArmorAC(playerid,0.0);
else
SetPlayerArmorAC(playerid,pArmor[playerid] - ammount);
return true;
}
stock HealthDamage(playerid,attackerid,weaponid,Float:ammount)
{
if(pHealth[playerid] <= 0)
return false;
if(pHealth[playerid] - ammount <= 0)
{
Killed[playerid] = true;
SetPlayerHealthAC(playerid,0.0);
OnPlayerBulletDeath(playerid,attackerid,weaponid);
}
else
SetPlayerHealthAC(playerid,pHealth[playerid] - ammount);
return true;
}
stock GiveDamageForPlayer(playerid,attackerid,weaponid,Float:ammount)
{
if(pArmor[playerid] >= 1)
{
if(pArmor[playerid] - ammount <= 0)
{
SetPlayerArmorAC(playerid,attackerid,weaponid,0.0);
HealthDamage(playerid,attackerid,weaponid,ammount - pArmor[playerid]);
}
else
ArmorDamage(playerid,attackerid,weaponid,ammount);
}
else
HealthDamage(playerid,attackerid,weaponid,ammount);
return true;
}
Код:
stock GetWeaponSlot(weaponid)
{
new slot;
switch(weaponid)
{
case 0,1: slot = 0;
case 2..9: slot = 1;
case 22..24: slot = 2;
case 25..27: slot = 3;
case 28,29,32: slot = 4;
case 30,31: slot = 5;
case 33,34: slot = 6;
case 35..38: slot = 7;
case 16..18,39: slot = 8;
case 41..43: slot = 9;
case 10..15: slot = 10;
case 44..46: slot = 11;
case 40: slot = 12;
default: slot = -1;
}
return slot;
}
Код:
stock SetPlayerHealthAC(playerid,Float:ammount)
{
if(ammount > 255.0 || ammount < 0.0) return false;
pHealth[playerid] = ammount;
SetPlayerHealth(playerid,ammount);
return true;
}
Код:
stock SetPlayerArmorAC(playerid,Float:ammount)
{
if(ammount > 255.0 || ammount < 0.0) return false;
pHP[playerid] = ammount;
SetPlayerArmor(playerid,ammount);
return true;
}
Создадим свой паблик для обработки смерти от пуль. В чем его преимущество - даже если читер будет блокировать смерть , паблик все равно будет вызываться. Туда вы можете добавить все обычные функции из OnPlayerDeath
Код:
forward OnPlayerBulletDeath(playerid,killerid,weaponid);
public OnPlayerBulletDeath(playerid,killerid,weaponid)
{
// приведу пример использования
new stringer[144], name1[MAX_PLAYER_NAME],name2[MAX_PLAYER_NAME];
GetPlayerName(playerid, name1, sizeof(name1));
GetPlayerName(killerid, name2, sizeof(name2));
format(stringer,sizeof(stringer),"%s убил %s выстрелами из оружия",name2,name1);
return SendClientMessageToAll(-1,stringer);
}
В OnPlayerConnect
Код:
for(new i = 0; i <13; i++ ) pAmmo[playerid][i] = 0;
pHealth[playerid] = 0.0;
pArmor[playerid] = 0.0;
HWarning[playerid] = 0;
AWarning[playerid] = 0;
Killed[playerid] = false;
В public OnPlayerWeaponShot вставляем перехват выстрелов и дамага с них
Код:
if(pAmmo[playerid][GetWeaponSlot(weaponid)] <= 0)
return Kick(playerid); // Вы были кикнуты по подозрению в читерстве! (0xFF1C)
pAmmo[playerid][GetWeaponSlot(weaponid)]--;
if(hittype == 1)
{
if(PlayerAFK(hitid))
return false; // тут ваша проверка на афк. Я же использую собственный stock PlayerAFK, вы же подгоните под свою систему
if(Killed[hitid])
return false;
switch(weaponid)
{
// дамаг измерялся с самого самп рп.
case 23: GiveDamageForPlayer(hitid,playerid,23,14.0); // SD Pistol
case 24: GiveDamageForPlayer(hitid,playerid,24,47.0); // Deagle
case 29: GiveDamageForPlayer(hitid,playerid,29,8.0); // MP5
case 30: GiveDamageForPlayer(hitid,playerid,30,10.0); // AK-47
case 31: GiveDamageForPlayer(hitid,playerid,31,10.0); // M4A1
case 33: GiveDamageForPlayer(hitid,playerid,33,25.0); // Rifle
default: return false;
}
return false;
}
В public OnPlayerSpawn добавляем
Код:
SetPlayerHealthAC(playerid,100); // или другое выдаваемое вами хп при спавне
Killed[playerid] = false;
В public PlayerUpdate (секундный индивидуальный таймер. если у вас нету такового, то ниже будет ссылочка на готовый урок)
Код:
new Float:health, Float:armor;
GetPlayerHealth(playerid,health);
GetPlayerArmor(playerid,armor);
if(health != pHealth[playerid]) HWarning[playerid] ++;
else HWarning[playerid] = 0;
if(armor != pArmor[playerid]) AWarning[playerid] ++;
else AWarning[playerid] = 0;
if(AWarning[playerid] >= 3 || HWarning[playerid] >= 3) Kick(playerid);
[HR][/HR]
- Всю выдачу брони и хп в моде (SetPlayerHealth и SetPlayerArmor) необходимо заменить на новые функции, иначе людей будет кикать
Сразу хочу сказать, что некоторые моменты не доделаны и возможно будут мною исправлены позже (лень).
Система опубликована только для ознакомления, с помощью нее вы можете написать себе много классных античитов, систему прокачки скиллов, а может даже свою систему дамага с проверкой на навык владения оружием игрока и проверку на часть тела, в которую летела пуля. Дерзайте, все в ваших руках.
С вами был автор иследований и мануала iMaddy (Alexandr Bochkarev).
Последнее редактирование:
