Сразу хочу предупредить, что объяснять доходчиво и понятно для новичков я не умею. Если вы новичок и хотите эту "классную хичу" себе на сервер, но не понимаете суть темы - либо уходите, либо изучайте.
От автора: Система сделана исключительно как на SAMP-RP или на подобии как на SAMP-RP так что и количество наносимого дамага с разного оружия будет в точности как на SAMP-RP. Что есть в этой системе: - АнтиГМ от пуль; - Античит на выстрел несуществующих патрон (не контрится, можно считать как античит на оружие и патроны, 2 в 1); - Античит на ХП и броню;
Описание мануала: делаем собственную систему дамага от пуль, тем самым блокируем любые античиты на гм от пуль.
Ну вот, вступительная часть подошла к концу.
История версий: 0.1 - Написана система 0.2 - Система улучшена (теперь не контриться NOPом SetPlayerHealth), античит на хп, античит на броню, добавлено снятие брони при выдачи дамага игроку, проверка на афк. 0.3 - Исправление недоработки системы, в частности снятие брони без хп и возможность убить 2 раза. Спасибо ему (http://vk.com/id97100958) за то, что сообщил об этом.
Ко всем 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) Функция выдачи оружия сервером. Можете совместить со своей функцией
Создадим свой паблик для обработки смерти от пуль. В чем его преимущество - даже если читер будет блокировать смерть , паблик все равно будет вызываться. Туда вы можете добавить все обычные функции из 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;
В 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 (секундный индивидуальный таймер. если у вас нету такового, то ниже будет ссылочка на готовый урок)
- Всю выдачу брони и хп в моде (SetPlayerHealth и SetPlayerArmor) необходимо заменить на новые функции, иначе людей будет кикать
Сразу хочу сказать, что некоторые моменты не доделаны и возможно будут мною исправлены позже (лень). Система опубликована только для ознакомления, с помощью нее вы можете написать себе много классных античитов, систему прокачки скиллов, а может даже свою систему дамага с проверкой на навык владения оружием игрока и проверку на часть тела, в которую летела пуля. Дерзайте, все в ваших руках.
С вами был автор иследований и мануала iMaddy (Alexandr Bochkarev). Вопросами по сайту и так же игровому рынку (развод, невалидные товары, добавление в ЧС, проведение сделок) не занимаюсь