willpower |
Дата: Понедельник, 02.03.2015, 14:03 | Сообщение # 1
|
Боец
Сообщений: 167
Статус: Offline
|
Привет юзерам портала. На днях накатал простенький анти-чит на гм, решил поделиться. И так, приступим непосредственно к делу. В САМОМ КОНЦЕ ПОЛНЫЙ КОД СКРИПТА ДАННЫЙ АНТИЧИТ БУДЕТ РАБОТАТЬ ТОЛЬКО НА СЕРВЕРЕ С ВКЛЮЧЕННЫМ LAGCOMPMODE(стрельба по скину) ДЛЯ НАСТРОЙКИ ПОД ПИНГ ИСПОЛЬЗУЙТЕ OnPlayerTakeDamage В самом начале нам необходимо подключить инклуды и забить макросы, которыми будем пользоваться в дальнейшем для упрощения работы. В начале кода пишем: Код #include <a_samp> //Подключаем инклуд #define function%0(%1) forward%0(%1); public%0(%1) //Делаем макрос Теперь же, нам необходимо прописать колбэк, вызывающийся при выстрелах игрока, т.е. далее пишем: Код public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) И в него пихаем следующие: Код if(hitid!=INVALID_PLAYER_ID&&hittype==BULLET_HIT_TYPE_PLAYER) { new Float:hp[3]; //Создаём массив, в котором будут храниться здоровья игрока, в которого попали GetPlayerHealth(hitid,hp[0]); //Получаем здоровье игрока и заносим его в массив GetPlayerArmour(hitid,hp[1]); //Получаем броню игрока, также заносим в массив hp[2]=hp[0]+hp[1]; //Складываем броню и здоровье if(hp[2]<0)hp[2]=0; //Проверяем, если здоровье+броня у игрока меньше нули, то приравниваем их к нулю SetTimerEx("checkhp",150,false,"if",hitid,hp[2]); //Запускаем таймер, который через 150мс будет проверять кол-во здоровья у игрока, в которого стреляли } Т.е. получиться у нас должно вот так Код #include <a_samp> //Подключаем инклуд #define function%0(%1) forward%0(%1); public%0(%1) //Делаем макрос public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) { if(hitid!=INVALID_PLAYER_ID&&hittype==BULLET_HIT_TYPE_PLAYER) { new Float:hp[3]; //Создаём массив, в котором будут храниться здоровья игрока, в которого попали GetPlayerHealth(hitid,hp[0]); //Получаем здоровье игрока и заносим его в массив GetPlayerArmour(hitid,hp[1]); //Получаем броню игрока, также заносим в массив hp[2]=hp[0]+hp[1]; //Складываем броню и здоровье if(hp[2]<0)hp[2]=0; //Проверяем, если здоровье+броня у игрока меньше нули, то приравниваем их к нулю SetTimerEx("checkhp",150,false,"if",hitid,hp[2]); //Запускаем таймер, который через 150мс будет проверять кол-во здоровья у игрока, в которого стреляли } return 1; } А вот и сама проверка игрока на здоровье: Код function checkhp(checkid,Float:oldhp) { if(GetPlayerState(checkid)==PLAYER_STATE_ONFOOT)//Проверяем, не мёртв ли игрок?И не в машине ли он? { new Float:hp[3]; //Создаём массив GetPlayerHealth(checkid,hp[0]); //Получаем здоровье игрока и заносим его в массив GetPlayerArmour(checkid,hp[1]); //Получаем броню игрока и заносим её в массив hp[2]=hp[0]+hp[1]; //Складываем броню игрока и здоровье if(hp[2]<0)hp[2]=0; //Проверяем, если броня и здоровье игрока меньше нуля, то приравнием их к нулю if(floatround(hp[2])>=floatround(oldhp)) //Если округлённое значение текущего здоровья больше, либо равно предыдищиму, что у нас было в OnPlayerWeaponShot, то игрок - читер. //Но не спешите с выводами! Эта "система" не совершенна и может выдавать ложные вызовы, если у игрока лаги. { SendClientMessageToAll(-1,"gm detected"); //Игрок использует годмод. Ваши действия } } } Вставляем это в любую часть кода. Теперь поговорим о ложных вызовах. Так как колбэк OnPlayerWeaponShot вызывается даже когда игрок АФК, после чего последует ложный вызов (Простой пример: вы стреляете в игрока, котоорый находится в АФК и античит срабатывает) желательно делать проверку на АФК, а также ложные вызовы могут быть при лагах у того, в кого стреляют, так что делать проверку на пакетлос и пинг тоже было бы не плохо. Теперь убираем ложный вызов с АФК. В начале, после '#define' создаём новый глобальный массив, отвечающуй за статус игрока (АФК/НЕ АФК) Код new plAFK[MAX_PLAYERS]; Теперь, если нет колбэка OnPlayerSpawn(playerid) - прописываем его и пишем в нём Теперь также делаем с колбэком OnPlayerRequestClass(playerid,classid), вот только вместо '0' пишем '2', то есть: В колбэк OnPlayerDeath прописываем После всего этого создаём односекундный таймер, то есть в колбэк запуска (в OnGameModeInit или в OnFilterScriptInit, в зависимости от того, что у вас, фильтерскрипт или гейммод) прописываем: Код SetTimer("PlUpdate",1000,true); //Запускаем таймер, вызывающий 'самописный' колбэк PlUpdate, который мы разберём ниже, повторяющийся через 1000мс И в конец мода прописываем Код function PlUpdate() { for(new playerid=0;playerid!=GetMaxPlayers();playerid++)if(IsPlayerConnected(playerid)&&!IsPlayerNPC(playerid)) { if(plAFK[playerid]==0) plAFK[playerid]-=1; } } В OnPlayerUpdate пишем: Код } public OnPlayerUpdate(playerid) { plAFK[playerid]=1; if(plAFK[playerid]>-2) plAFK[playerid]=0; return 1; } Вот и всё, афк-сис-ма готова, осталось только сделать проверку игрока на АФК, то есть в OnPlayerWeaponShot вместо Код if(hitid!=INVALID_PLAYER_ID&&hittype==BULLET_HIT_TYPE_PLAYER) Пишем: Код if(hitid!=INVALID_PLAYER_ID&&hittype==BULLET_HIT_TYPE_PLAYER&&plAFK[playerid]==0) И в checkhp вместо Код if(GetPlayerState(playerid)==PLAYER_STATE_ONFOOT) Пишем: Код if(GetPlayerState(playerid)==PLAYER_STATE_ONFOOT&&plAFK[playerid]==0) Вот и всё. Весь полноценный код античита с системой афк: Код #include <a_samp> #define function%0(%1) forward%0(%1); public%0(%1) new plAFK[MAX_PLAYERS]; public OnFilterScriptInit() { SetTimer("PlUpdate",1000,true); return 1; } public OnPlayerSpawn(playerid) { plAFK[playerid]=0; return 1; } public OnPlayerDeath(playerid,killerid,reason) { plAFK[playerid]=-2; return 1; } public OnPlayerRequestClass(playerid,classid) { plAFK[playerid]=2; return 1; } public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) { if(hitid!=INVALID_PLAYER_ID&&hittype==BULLET_HIT_TYPE_PLAYER&&plAFK[hitid]==0) { new Float:hp[3]; GetPlayerHealth(hitid,hp[0]); GetPlayerArmour(hitid,hp[1]); hp[2]=hp[0]+hp[1]; if(hp[2]<0)hp[2]=0; SetTimerEx("checkhp",150,false,"if",hitid,hp[2]); } return 1; } public OnPlayerUpdate(playerid) { plAFK[playerid]=1; if(plAFK[playerid]>-2) plAFK[playerid]=0; return 1; } function checkhp(playerid,Float:oldh) { if(GetPlayerState(playerid)==PLAYER_STATE_ONFOOT&&plAFK[playerid]==0) { new Float:hp[3]; GetPlayerHealth(playerid,hp[0]); GetPlayerArmour(playerid,hp[1]); hp[2]=hp[0]+hp[1]; if(hp[2]<0)hp[2]=0; if(floatround(oldh)<=floatround(hp[2])) { //ваши действия, если игрок юзает } } } function PlUpdate() { for(new playerid=0;playerid!=GetMaxPlayers();playerid++) if(IsPlayerConnected(playerid)&&!IsPlayerNPC(playerid)) { if(plAFK[playerid]==0) plAFK[playerid]-=1; } } По вопросам прошу писать в этой теме, автором урока являюсь я, и код анти-чита, соответственно, тоже мой.
Сообщение отредактировал willpower - Понедельник, 02.03.2015, 14:38 |
|
|
|
Maler[CM] |
Дата: Четверг, 12.03.2015, 06:24 | Сообщение # 2
|
MOSKVASTAN
Сообщений: 440
Статус: Offline
|
Ты ли автор?
Сегодня проверю, если работает '+' рубану
ВК: https://vk.com/vdovkinn Skype: nikita24682 CM One Love:*
|
|
|
|
[Котяра] |
Дата: Четверг, 12.03.2015, 21:24 | Сообщение # 3
|
#kotyara
Сообщений: 573
Статус: Offline
|
Работает , спасибо!
[b][color=red][url=http://cheat-master.ru/forum/134-452611-1] *Котики Здесь* - Design Studio [/url][/color][/b] [img]http://i.imgur.com/UZuRmcl.gif[/img][img]http://i.imgur.com/UZuRmcl.gif[/img]
|
|
|
|
helly |
Дата: Вторник, 17.03.2015, 20:11 | Сообщение # 4
|
Боец
Сообщений: 107
Статус: Offline
|
А потом ложными пакетами положить сервер. Круто
У AGGRESSOR`a аватарку угнал - мама ама криминал // AGRESSOR не простил. Связь со мной: vk.com/snappboy
|
|
|
|
[CM]McElroy™ |
Дата: Воскресенье, 22.03.2015, 17:17 | Сообщение # 5
|
Боец
Сообщений: 65
Статус: Offline
|
Это можно как FS сделать?
[url=http://nick-name.ru/nickname/id1095829/][img]http://nick-name.ru/forum3t0/Slava_Horners.gif[/img][/url]
|
|
|
|
[CM]Kingster |
Дата: Воскресенье, 24.05.2015, 16:29 | Сообщение # 6
|
Боец
Сообщений: 245
Статус: Offline
|
Цитата [CM]McElroy™ ( ) Это можно как FS сделать? Конечно
Пользователь Cheat - Master уже 400 дней.
Я в Контакте - vk.com/buddy_fly
|
|
|
|
puff2h |
Дата: Среда, 18.01.2017, 01:15 | Сообщение # 7
|
Боец
Сообщений: 110
Статус: Offline
|
Мне надо сделать чтобы можно было убить в АФК. ХП не изменяется у игрока в АФК, даже если в OnPlayerWeaponShot, почему?
|
|
|
|
James_Lombardo |
Дата: Пятница, 20.01.2017, 09:44 | Сообщение # 8
|
Боец
Сообщений: 131
Статус: Offline
|
Годная тема!
Аккаунт разрешен администратором Sponge_Noob Я здесь уже 999-й день https://vk.com/id401812964
|
|
|
|