[TUTORIAL] Анти-гм - Форум Cheat-Master.ru
  • Страница 1 из 1
  • 1
Модератор форума: Phoenixxx_Czar, Getbackthere, [CM]OlegEhtler  
Форум » Pawno программирование SAMP » Уроки | FAQ » [TUTORIAL] Анти-гм
[TUTORIAL] Анти-гм
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) - прописываем его и пишем в нём
Код
plAFK[playerid]=0;

Теперь также делаем с колбэком OnPlayerRequestClass(playerid,classid), вот только вместо '0' пишем '2', то есть:
Код
plAFK[playerid]=2;

В колбэк OnPlayerDeath прописываем
Код
plAFK[playerid]=-2;

После всего этого создаём односекундный таймер, то есть в колбэк запуска (в 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
Ты ли автор?

Сегодня проверю, если работает '+' рубану cool


ВК: 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
А потом ложными пакетами положить сервер. Круто biggrin

У 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
Форум » Pawno программирование SAMP » Уроки | FAQ » [TUTORIAL] Анти-гм
  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума
Лучшие пользователи
Admin [39113]

GеNius [7209]

[CM]Russel [5557]

kenlo763 [4952]

[CM]AGRESSOR [4639]

Snake_Firm [4452]

Сэс [4416]

Artem_Buero [4223]

[CM]Durman [3204]

[CM]Рафаэль [3080]

iMaddy [2855]

sky_Woker [2854]

getrekt [2745]

Новые пользователи
pokotiloroman91 [18:24]

stephensh5 [12:00]

calliesv7 [06:11]

louqm16 [22:14]

artushak [16:32]

Kingpolker [15:42]

leeyv11 [15:12]

Trappa17 [01:00]

Djamalchik [16:40]

ajeense [14:24]

654470559 [08:55]

Newtone [03:01]

godspeed [21:31]