Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Анти-Чит на Perfect Aim

iWors

Эксперт
Доброго времени суток уважаемые гости данной темы.
Сегодня специально для Pawno-Info сделал небольшой анти-чит, в котором на данный момент нуждаются очень многие популярные проекты жанра DeathMatch, да и РП тоже :)
Итак, начнём.

PHP:
#define C_RED 0xFF0000FF
#define C_GREY 0xAFAFAFFF
Для начала, нам потребуется паблик, с которым мы и будем работать, а именно:
PHP:
OnPlayerWeaponShot
Информация о функции OnPlayerWeaponShot:
PHP:
Вызывается когда игрок совершает выстрел.
PHP:
Примечание: Поддерживается только огнестрельное оружие!
PHP:
Примечание: Поддерживается только пассажирский драйв-бай (не водительский)!

Параметры:

PHP:
OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
playerid
[HIDE-POSTS]ID игрока который выстрелил(weaponid)
ID оружия с которого выстрелил игрок(hittype)
Тип попадания пули (пустота, игрок, машина, объект) (hitid)
ID игрока, машины или объекта по которому попала пуля(fX)
Координата X куда попала пуля(fY)
Координата Y куда попала пуля(fZ)
Координата Z куда попала пуля(Возвращает)

0 - Запрещает причинения ущерба от пули. 1 - Разрешает причинение ущерба.[/HIDE-POSTS]

Для начала создадим переменную, которая нам в дальнейшем понадобится
PHP:
new AimOff[MAX_PLAYERS] = { 0, ... }; // оптимизирование переменной
Далее, нам потребуется public OnPlayerDisconnect. Объясню для чего, мы сделаем чтобы игрока кикало, за употребление данного ввида Aim'a, и при кике мы обновляем переменную до нуля, то есть в OnPlayerDisconnect'e у нас должен быть ноль:
PHP:
AimOff[playerid] = 0;// Очищаем

В
PHP:
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
вставляем:
PHP:
if(hitid != INVALID_PLAYER_ID)
    {
        if(hittype == 1)
        {
	        if(IsPlayerInAnyVehicle(playerid)) return false;
	        if(fX == 0.000000 || fY == 0.000000 || fZ == 0.000000)
            {
				 if(hitid != 65535)
				 {
		            if(AimOff[playerid] == 2)
		            {
		               SendClientMessage(playerid,C_RED,"Вы были кикнуты по подозрению в читерстве. Код античита: 001#]"), Kick(playerid); // C_RED (цвет можете посмотреть в начале темы)
		               return 0;
		            }
		            else if(AimOff[playerid] == 1)
		            {
		               if(GetPVarInt(playerid,"KickFlood") == 0)
		               {
                                  // Если будет ошибка "nsa", то добавьте следующее:
                                  // new nsa[
		                  format(nsa, sizeof(nsa), "[Информация] %s[%d] возможно использует новый вид Aim'a (Perfect aim)", PlayerInfo[playerid][pNames],playerid); // PlayerInfo[playerid][pNames] - функция отвечает за ник игрока, используйте свою.
		                  SendAdminMessage(C_GREY, nsa); // Сообщение в административный чат. 
		                  SetPVarInt(playerid,"KickFlood",1);
		               }
		            }
		            AimOff[playerid]++;
				 }
            }
Собственно, всё. Приятного использования :)
Некоторая информация было взята с оффициального сайта SA:MP.
 
Последнее редактирование:
Сверху Снизу