Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 34
  1. #1
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±

    Анти Weapon/Ammo Hack

    Описание:
    Зайдя на большинство серверов с интересной механикой прокачки скиллов оружия или где много разного оружия выдающегося по рангу или по какому то званию наверное наблюдали как игроки нубцы которые только вошли на серв уже бегают с таким же арсеналом как и деды этого серва, обычно владельцы сервов пишут античит на оружие по рангам или часам, но опять же получили Вы ранг выше/ниже и можете добавить себе патронов или вовсе включить их бесконечность и так далее, я думаю это всё не правильно и игрокам которые давно играют не в кайф видеть такие печальные картины, ещё на 0.3e я начал писать этот античит на оружие, единственно что не хватало там так это отслеживания выстрела(пытался знаете сделать костыль с Key State мол мышкой клацнул и выстрел), но как то надоело костылеписание это и поменял версию на 0.3.7 и добился полного успеха в написании этого античита на оружия и патроны к ним, либо мой античит не кому не охото обходить, либо он действительно уже дошёл до успеха, но мне кажется первый вариант


    Плюсы
    • Видит выдачу любого левого оружия
    • Видит выдачу любого левого патрона
    • Видит подмену оружия в слоте
    • Контролирует б/к на бесконечность
    • Данный код будет ловить читера как пешком так и в авто
    • Максимально складный код без мусора
    • Всё это без ложных вызовов (Если внимательно прочитать код и поставить в нужном месте свою проверку на AFK)

    Минусы
    • На водительском месте не функционирует один(важный) каллбек, тем самым водительское место пришлось зафиксить

    Код(v 0.4):

    Pastebin
    Или же
     тут

    PHP код:
    /*

            Античит на оружие и патроны. [ver. 0.4]                    (By vovandolg)
            Специально для портала Pro-Pawn                            (http://www.pro-pawn.ru)
            
            
            Логи разработки:
            [0.4]
                - Патроны теперь записываются с каждого слота в отдельный массив
                (так будет правильнее и удобнее для дальнейшей разработки мода на оружейные механики)
                - Водительское место было зафиксено скрытием оружия из рук игрока
                (слишком много уязвимости на водительском месте)
                
            [0.3]
                - Проверка на подмену оружия в слоте (например: AK-47 можно было заменить на M4)
                - Более детальная проверка на наличие парашюта при десантировании с воздушных транспортов

            [0.2]
                - Фикс ложного вызова античита при смерти
                - Более детальная проверка на Infinity ammo
    */

    #include <a_samp>
    #include <foreach>

    #define TIME_GLOBAL_UPDATE       (1000)  //кол-во миллисекунд для апдейта таймера античита
    #define MAX_SLOT_WEAP            (13)    //кол-во слотов оружия у игрока
    #define MAX_TICK_PAUSE_AC        (3)     //кол-во раз игнора античита на игрока, 3 - стабильно
    #define SLOT_WEAPON_PARACHUTE    (11)    //id слота в котором у игрока находится парашют
    #define FIX_SPAWN_RESET_WEAP             //закомментировать если фикс сброса оружия при смерти не нужен

    #define FIX_DRIVER_WEAPONS               //закомментировать если фикс скрытия оружия у водителя не нужен

    #if defined FIX_DRIVER_WEAPONS
        #define MAX_DHW_TIMER        (1500)
        //кол-во миллисекунд для таймера(скрытие оружия у водителя при посадке)
    #endif


    main(){}


    new 
    pPauseAC_one[MAX_PLAYERS char],
        
    pPauseAC_two[MAX_PLAYERS char],
        
    pState[MAX_PLAYERS char],
        
    pWeapon[MAX_SLOT_WEAP][MAX_PLAYERS char],
        
    pAmmo[MAX_SLOT_WEAP][MAX_PLAYERS],
        
    pUseVehicleID[MAX_PLAYERS],
        
    timglobal;

    static const 
    weapon_slot[47] =
    {
        
    00,
        
    11111111,
        
    101010101010,
        
    888,
        
    000//19-21
        
    222,
        
    333,
        
    44,
        
    55,
        
    4,
        
    66,
        
    7777,
        
    8,
        
    12,
        
    999,
        
    111111
    };

    //--------------------[ Перехватим-ка функции :3 ]------------------------------
    stock GivePlayerWeaponAC(playeridweaponidamount)
    {
        if(
    IsPlayerConnected(playerid) == 0) return 0;
        new 
    w_slot weapon_slot[weaponid];
        
    pPauseAC_one{playerid} = MAX_TICK_PAUSE_AC;
        
    pWeapon[w_slot]{playerid} = weaponid;
        
    pAmmo[w_slot][playerid] += amount;
        
    GivePlayerWeapon(playeridweaponidamount);
    #if defined FIX_DRIVER_WEAPONS
        
    if(pState{playerid} == PLAYER_STATE_DRIVER)
        {
            
    SetTimerEx(!"DriverHidesWeapons"MAX_DHW_TIMERfalse"i"playerid);
        }
    #endif
        
    return 1;
    }
    #if defined _ALS_GivePlayerWeapon
        #undef    GivePlayerWeapon
    #else
        #define    _ALS_GivePlayerWeapon
    #endif
    #define    GivePlayerWeapon        GivePlayerWeaponAC

    stock ResetPlayerWeaponsAC(playerid)
    {
        if(
    IsPlayerConnected(playerid) == 0) return 0;
        
    pPauseAC_one{playerid} = MAX_TICK_PAUSE_AC;
        
    ResetPlayerWeapons(playerid);
        for(new 
    iMAX_SLOT_WEAPi++)
        {
            
    pWeapon[i]{playerid} = 0;
            
    pAmmo[i][playerid] = 0;
        }
        return 
    1;
    }
    #if defined _ALS_ResetPlayerWeapons
        #undef    ResetPlayerWeapons
    #else
        #define    _ALS_ResetPlayerWeapons
    #endif
    #define    ResetPlayerWeapons        ResetPlayerWeaponsAC

    //Для перехвата можно ещё SetPlayerAmmo/SetSpawnInfo добавить,
    //но на основе этих функций можете сами слепить ...
    //------------------------------------------------------------------------------


    public OnGameModeInit()
    {
        
    SetGameModeText(!"AntiCheat Test");
        
    AddPlayerClass(00.00.04.00.0, -1,-1,-1,-1,-1,-1);
        
    CreateVehicle(4117.07.06.00.000601);
        
    CreateVehicle(4259.08.07.00.000601);
        
    CreateVehicle(46110.09.08.00.000601);
        
    timglobal SetTimer(!"OnGlobalUpdate"TIME_GLOBAL_UPDATEtrue);
        return 
    1;
    }

    public 
    OnGameModeExit()
    {
        
    KillTimer(timglobal);
        return 
    1;
    }


    public 
    OnPlayerDisconnect(playerid)
    {
        for(new 
    iMAX_SLOT_WEAPi++)
        {
            
    pWeapon[i]{playerid} = 0;
            
    pAmmo[i][playerid] = 0;
        }
        return 
    0;
    }

    //Паблик затронут только для того чтобы выдать оружие
    public OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        if(
    newkeys KEY_YES// Y
        
    {
            
    GivePlayerWeapon(playerid241);
            
    GivePlayerWeapon(playerid282);
            
    GivePlayerWeapon(playerid313);
            
    GivePlayerWeapon(playerid344);
        }
        if(
    newkeys KEY_NO// N
        
    {
            
    GivePlayerWeapon(playerid231);
            
    GivePlayerWeapon(playerid292);
            
    GivePlayerWeapon(playerid303);
            
    GivePlayerWeapon(playerid334);
        }
        return 
    1;
    }

    public 
    OnPlayerStateChange(playeridnewstateoldstate)
    {
        
    pState{playerid} = newstate;
        if(
    newstate == PLAYER_STATE_WASTED || (newstate == PLAYER_STATE_ONFOOT &&
        (
    oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER)))
        {
            
    pUseVehicleID[playerid] = 0;
        }
    #if defined FIX_DRIVER_WEAPONS
        
    if(newstate == PLAYER_STATE_DRIVER)
        {
            
    SetTimerEx(!"DriverHidesWeapons"MAX_DHW_TIMERfalse"i"playerid);
        }
    #endif
        
    return 1;
    }

    public 
    OnPlayerDeath(playeridkilleridreason)
    {
        
    //Точно не скажу нужен ли тут сброс оружия,
        //но на ранних версиях SA:MP наблюдался баг показания неверных данных в GPWD
    #if defined FIX_SPAWN_RESET_WEAP
        
    ResetPlayerWeapons(playerid);
    #else
        
    for(new iMAX_SLOT_WEAPi++)
        {
            
    pWeapon[i]{playerid} = 0;
            
    pAmmo[i][playerid] = 0;
        }
    #endif
        
    return 1;
    }

    public 
    OnPlayerEnterVehicle(playeridvehicleidispassenger)
    {
        
    pUseVehicleID[playerid] = vehicleid;
        return 
    1;
    }

    public 
    OnPlayerExitVehicle(playerid)
    {
        
    //Парашют при выходе с воздушного транспорта )-_-(
        
    if(IsAirTransport(GetVehicleModel(pUseVehicleID[playerid])) == 1)
        {
            
    pPauseAC_one{playerid} = MAX_TICK_PAUSE_AC 1;
            
    pWeapon[SLOT_WEAPON_PARACHUTE]{playerid} = WEAPON_PARACHUTE;
            
    pAmmo[SLOT_WEAPON_PARACHUTE][playerid] = 1;
        }
        return 
    1;
    }

    public 
    OnPlayerWeaponShot(playeridweaponidhittypehitidFloat:fXFloat:fYFloat:fZ)
    {
        
    //Боремся с Infinity Ammo ^-^
        
    new wslot weapon_slot[weaponid];
        if(
    pAmmo[wslot][playerid] > 0)
        {
            
    pPauseAC_two{playerid} = MAX_TICK_PAUSE_AC 1;
            
    pAmmo[wslot][playerid]--;
        }
        else return 
    0;
        return 
    1;
    }


    forward OnGlobalUpdate();
    public 
    OnGlobalUpdate()
    {
        foreach(new 
    iPlayer)
        {
            
    //Проверяем игрока на то что он живой и бегает по карте
            //Рекомендую сюда всунуть ещё свою проверку игроков на AFK
            
    if(pState{i} == || pState{i} == 8) continue;

            if(
    pPauseAC_two{i} > 0pPauseAC_two{i}--;
            if(
    pPauseAC_one{i} > 0)
            {
                
    pPauseAC_one{i}--;
                continue;
            }

            new 
    weaponid[MAX_SLOT_WEAP],
                
    weaponammo[MAX_SLOT_WEAP];
                
            for(new 
    sMAX_SLOT_WEAPs++)
            {
                
    //Начинаем записывать инфу оружия и б/п из слота
                
    GetPlayerWeaponData(isweaponid[s], weaponammo[s]);
                
                
    //Проверяем на обход в минус или на Infinitiy ammo
                
    if(pAmmo[s][i] < || weaponammo[s] < 0)
                {
                    
    printf("[part] Player[%i] slot[%i] pAmmo[%i] weaponammo[%i], kick!"ispAmmo[s][i], weaponammo[s]);
                    
    SendClientMessage(i, -1, !"Айяй, бесконечные патроны юзаешь или обошёл?![#001]");
                    
    ResetPlayerWeapons(i);
                    
    //Kick(i);
                    
    break;
                }

                
    //Совпало ли оружие в слоте с тем которое выдавал сервер
                
    if(weaponid[s] > && weaponid[s] != pWeapon[s]{i})
                {
                    
    printf("[part] Player[%i] pWeapon[%i] slot[%i] weaponid[%i], kick!"ipWeapon[s]{i}, sweaponid[s]);
                    
    SendClientMessage(i, -1, !"Айяй, я тебе такой ствол не давал![#002]");
                    
    ResetPlayerWeapons(i);
                    
    //Kick(i);
                    
    break;
                }

                if(
    pPauseAC_two{i} > 0) continue;

                
    //Если кол-во записанных патронов в слоте меньше чем найденных(хакнутых)
                
    if(pAmmo[s][i] < weaponammo[s])
                {
                    if(
    pPauseAC_one{i} == && pPauseAC_two{i} == 0)
                    {
                        
    printf("[part] Player[%i] slot[%i] pAmmo[%i] weaponammo[%i], kick!"ispAmmo[s][i], weaponammo[s]);
                        
    SendClientMessage(i, -1, !"Айяй, патроны воруешь![#003]");
                        
    ResetPlayerWeapons(i);
                        
    //Kick(i);
                        
    break;
                    }
                    else break;
                }

                
    //Если кол-во записанных патронов в слоте больше чем найденных,
                //то обновим кол-во патронов в переменной слота оружия
                
    else if(pAmmo[s][i] > weaponammo[s])
                {
                    if(
    pPauseAC_one{i} == && pPauseAC_two{i} == 0pAmmo[s][i] = weaponammo[s];
                    else break;
                }
                
    //Если кол-во записанных патронов в слоте равно найденным,
                //то не теребонькаем систему ;D
            
    }
        }
        return 
    1;
    }

    #if defined FIX_DRIVER_WEAPONS
        
    forward DriverHidesWeapons(playerid);
        public 
    DriverHidesWeapons(playerid)
            return 
    SetPlayerArmedWeapon(playerid0);
    #endif

    //Является ли указанный vehid воздушным транспортом, 1 - да | 0 - нет
    stock IsAirTransport(vehid)
    {
        switch(
    vehid)
        {
            case 
    417,425,447,460,469,476,487,488,497,511..513,
                 
    519,520,548,553,563,577,592,593: return 1;
        }
        return 
    0;


    Автор античита:
    vovandolg

    Античит был написан по полученным знаниям этого замечательного форума!
    Последний раз редактировалось vovandolg; 26.04.2017 в 16:48. Причина: update 0.4
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  2. #2
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Молодец, довольно просто реализовано.
    Единственный пока найденный минус - бесконечная стрельба возможна до тех пор, пока читеру это не надоест, т.к. реагировать античит начинает только после прекращения стрельбы. Наказание слишком уж запаздывает.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  3. #3
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Молодец, довольно просто реализовано.
    Единственный пока найденный минус - бесконечная стрельба возможна до тех пор, пока читеру это не надоест, т.к. реагировать античит начинает только после прекращения стрельбы. Наказание слишком уж запаздывает.
    Ну для простеньких РПшек или ДМ это норма) если читера будет постоянно кикать ему тоже надоест, а если поставить Ban по IP то он пару разов или разок так сделает и больше не зайдёт, это я говорю как владелец серва на вкладке, они когда видят что их кикает и обойти не могут сразу пуканы подгорают и прекращают коннектится...
    В общем так спокойнее стало и за экономику в плане оружия и патронов стало честнее.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  4. #4
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Так если бы его кикало. Во время стрельбы с бесконечными патронами никого не кикает (а только после её прекращения). Следовательно, перед киком такой желанный игрок ещё пол сервера перебить успеет.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  5. #5
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Так если бы его кикало. Во время стрельбы с бесконечными патронами никого не кикает (а только после её прекращения). Следовательно, перед киком такой желанный игрок ещё пол сервера перебить успеет.
    Поверь не кому не захочется идти маленькими шажками с зажатыми кнопками мыши и ливать весь серв
    Это тоже читеров бесит..
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  6. #6
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    "Поверь-не поверь", а уязвимость у античита на бесконечные патроны есть.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  7. #7
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Что нибудь придумаю попозже(как освобожусь от долбанного огорода)
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  8. #8
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    PHP код:
    if (ammo 0// у игрока бесконечные патроны
    //или
    if (ammo == -31073// у игрока бесконечные патроны 

  9. #9
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    PHP код:
    if (ammo 0// у игрока бесконечные патроны
    //или
    if (ammo == -31073// у игрока бесконечные патроны 
    Обрисую ситуацию почему я именно так сделал, если игроку выдать через игру ствол и он активирует Infinity ammo у него не будет минуса, у него просто не будут отниматься патроны, а кол-во патронов в минусе можно настроить по разному хоть -31073, хоть -31074 и так далее, поэтому я и поставил < 0
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  10. #10
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    А если так?
    PHP код:
    new
        
    ac_time[MAX_PLAYERS],
        
    ac_ammo[MAX_PLAYERS]; 
    PHP код:
    public OnPlayerWeaponShot(playeridweaponidhittypehitidFloat:fXFloat:fYFloat:fZ)
    {
        if(
    GetTickCount() > ac_time[playerid])
        {
            new
                
    ammo ac_ammo[playerid];

            
    ac_ammo[playerid] = GetPlayerAmmo(playerid);
            
    ac_time[playerid] = GetTickCount() + 1000;

            if (
    ammo == ac_ammo[playerid])
                
    SendClientMessage(playerid, -1, !"Infinity ammo +");
            else
                
    SendClientMessage(playerid, -1, !"Infinity ammo -");
        }
        return 
    1;

    Последний раз редактировалось m1n1vv; 26.09.2016 в 21:21.

 

 
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •