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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±

    u_ac_money.inc

    U_AC_MONEY.INC BY UNTONYST
    Обновил из-за утери того инклуда :с

    Это простенький античит на деньги. Я решил сделать его более юзабильным и поэтому не стал прятать в функции-перехватчики функции для проверки игрока. Я подумал, что вы сами можете решать где вам надо проверить игрока на использование этого чита.

    Работа с инклудом:
    • Чтобы подключить его и начать им пользоваться, просто подключите его в самом начале вашего мода.
      PHP код:
      #include <u_ac_money> 
    • При ложных срабатываниях, связанные с проблемами с сетью, высоким пингом или чем-нибудь еще, перед подключением инклуда добавим
      PHP код:
      #define AC_MONEY_IGNORE_TIME 1000
      #include <u_ac_money> 


    Работа с функциями инклуда:
    • Функция CheckPlayerOnMoney.

      Опциональный параметр:
      PHP код:
      CheckPlayerOnMoney(playerid,  call=0
      Если вызывать функция с дополнительным вторым параметром, то вместе с функцией вызовется колбэк OnMoneyCheatDetected, если вы его используете, в котором вы можете указать свое наказание. Кроме того, у игрока будет восстановлен счет вне зависимости от используете вы колбэк или нет. А если не указывать, то вызвано ничего не будет, кроме возвращаемых значений.

      Возвращаемый значения:
      • 0: Игрок не использовал читы. Результат отрицательный.
      • 1: Игрок использовал читы. Результат положительный.

    • Колбэк OnMoneyCheatDetected:
      PHP код:
      public OnMoneyCheatDetected(playeridcheat_moneymoney)
      {


      Функция не возвращает никакого конкретного значения.

      Аргументы:
      • cheat_money: Сколько игрок начитерил денег.
      • money: Сколько у игрока по настоящему денег.


    Использование:
    PHP код:
    #include <zcmd> 
    #include <sscanf2> 

    CMD:checkplayer(playeridparams[]) 

        new 
    targetid
        if(
    sscanf(params"u"targetid)) 
            return 
    SendClientMessage(playerid, -1
                !
    "Введите /checkplayer [игрок]" 
            
    ); 
        if(
    CheckPlayerOnMoney(targetid) == 1
        { 
            static const 
    fmt_str[] = 
                
    "У игрока %s (id %i) была обнаружено использование чита на деньги."
            new 
    str[sizeof fmt_str + (-2+MAX_PLAYER_NAME) + (-2+4)]; 
            
    GetPlayerName(targetidstrMAX_PLAYER_NAME); 
            
    format(strsizeof strfmt_strstrtargetid); 
            return 
    SendClientMessage(playerid, -1str); 
        } 
        return 
    SendClientMessage(playerid, -1
            !
    "Использование чита на деньги не обнаружено." 
        
    ); 

    Скачать:
    Последний раз редактировалось Desulaid; 20.04.2016 в 13:32.

  2. 4 пользователя(ей) сказали cпасибо:
    Nexius_Tailer (10.05.2017) Processing (10.02.2016) Profyan (03.12.2015) Snoopdy (03.12.2015)
  3. #2
    Аватар для Unreal
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.09.2014
    Сообщений
    133
    Репутация:
    4 ±
    Можно на pastebin ?
    Pro-pawn.ru

  4. #3
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Unreal Посмотреть сообщение
    Можно на pastebin ?
    А чем вам гист не нравится?

  5. Пользователь сказал cпасибо:
    $continue$ (03.12.2015)
  6. #4
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Для чего
    PHP код:
    ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore"1000false"i"playerid); 
    Вызывать каждый раз и на 1 раз. Разве нельзя третьему параметру присвоить значение true?
    Ведь таймер не вызовет функцию еще раз, пока она не завершиться.



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  7. #5
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    Для чего
    PHP код:
    ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore"1000false"i"playerid); 
    Вызывать каждый раз и на 1 раз. Разве нельзя третьему параметру присвоить значение true?
    Ведь таймер не вызовет функцию еще раз, пока она не завершиться.

    Вместо тысячи слов
    (см. пункт два)

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

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение

    Вместо тысячи слов
    (см. пункт два)
    Согласен, проверил на собственном опыте.И убедился , что таймеры стоят в некой очереди. Т.е пока выполняется один, другие не выполняются.

    Но тогда последняя придирка( C: ), почему ты таймер в public AC_MoneyCore(playerid) вызываешь в начале тела,а не в конце?



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  9. #7
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    Согласен, проверил на собственном опыте.И убедился , что таймеры стоят в некой очереди. Т.е пока выполняется один, другие не выполняются.

    Но тогда последняя придирка( C: ), почему ты таймер в public AC_MoneyCore(playerid) вызываешь в начале тела,а не в конце?
    Когда я вызывал его после условия, то у меня флудило сообщениями, потом я поставил перезапуск вверх и флуд прекратился :*

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

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Когда я вызывал его после условия, то у меня флудило сообщениями, потом я поставил перезапуск вверх и флуд прекратился :*
    Ну ясно)) Хорошая работа!



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  11. #9
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    Но тогда последняя придирка( C: ), почему ты таймер в public AC_MoneyCore(playerid) вызываешь в начале тела,а не в конце?
    На результат это всё равно не повлияет. Очередь таймеров обработается только после выполнения функции.


    Добавлю несколько своих замечаний.
    1. Определись с префиксом.
    Код:
    U_AC_MONEY[MAX_PLAYERS]
    AC_MoneyCore // Какой здесь вообще префикс? "AC_Money" или "AC" ?
    ac_money[MAX_PLAYERS] // Аналогично...
    u_OnPlayerConnect
    ac_money__GivePlayerMoney
    Который раз уже приходится замечать эту проблему в твоих работах. Надеюсь, в этот раз ты не проигнорируешь её.

    2. В чём смысл делать пустые строки?
    PHP код:
    public AC_MoneyCore(playerid
    {
        
        
    ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore"1000false"i"playerid);
        
        if(
    GetPlayerMoney(playerid) != ac_money[playerid])
        {    
            
    ResetPlayerMoney(playerid);
            
    GivePlayerMoney(playeridac_money[playerid]);
        
            
    #if defined OnMoneyCheatDetected
                
    OnMoneyCheatDetected(playerid);        
            
    #endif    
            
            
    return 1;
        }    
        
        return 
    0;

    Вроде бы код не слишком сложный, получается только пустая трата вертикального пространства.

    3. Табуляция кое-где хромает. Мало того, лишние пробелы и табы в конце строк.

    4. Если у игрока списать деньги, они снимутся со счёта на стороне античита, но у игрока они по разным причинам, связанными с сетью, могут сняться не сразу. Следует хотя бы в течении 1-2 секунд после изменений пропускать проверку игрока.

    5. В чём профит делать такой отступ?
    PHP код:
    stock 
        ac_money__GivePlayerMoney
    (playeridmoney
        {
            
    ac_money[playerid] = money;
            
    GivePlayerMoney(playeridmoney);
        } 
    Я видел раньше, как некоторые делали похожие отступы при объявлении переменных, но там пишутся только названия переменных и каждое новое название переносится на следующую строку, но целые функции - это уже перебор, там же код может не вместиться в лимит из 80 символов по горизонтали.

    6. Нет перехвата функции GetPlayerMoney. Как результат, игрок таки может начитерить себе деньги и использовать их до того, как спалится античитом (например, передать их кому-нибудь). Ещё проще читеру будет, если пропускать проверки после выдачи денег, как я написал в п.4, поэтому перехват GetPlayerMoney просто необходим.

    7. ResetPlayerMoney тоже не помешало бы перехватить. Главное, чтобы эти перехваты, как и перехват GivePlayerMoney, были после AC_MoneyCore, чтобы не влиять на результаты проверок античита.


    Сама по себе работа простая: идея довольно древняя, код в основе работы - тоже, но подкупает наличие перехватов и коллбэка, вызываемого при обнаружении читерства. Как результат, установка и использование предельно просты, нет никаких привязок к конкретному моду. Побольше бы здесь таких работ.


    UPD: Заменил [php] на [code] в п.1.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  12. 3 пользователя(ей) сказали cпасибо:
    Desulaid (03.12.2015) Profyan (04.12.2015) VVWVV (03.12.2015)
  13. #10
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Daniel_Cortez, я помню, как ты говорил, что стоит подражать коду того же Y_Less. Может другими словами, но суть та. Поэтому я открыл в YSI библиотеку y_gui.inc и там такое

     Открыть
    PHP код:
    stock
        GUI_ShowForPlayer
    (playeridGUIgui)
        {
            if (!
    Bit_Get(YSI_g_sGUIBeingUsed_:gui))
                return 
    0;

            
    // ---------------------------------------------------------------------

            
    if (!Bit_Get(YSI_g_spGUIUsingplayerid))
                
    Bit_Let(YSI_g_spGUIUsingplayerid);

            
    // ---------------------------------------------------------------------

            
    YSI_g_spGUI[playerid]      = _:gui;
            
    YSI_g_spGUIItem[playerid] = 0;

            
    // ---------------------------------------------------------------------

            
    if (Bit_Get(YSI_g_sGUITitleUsing_:gui))
                
    TextDrawShowForPlayer(playeridYSI_g_sGUITextTitle[_:gui][0]);

            if (
    Bit_Get(YSI_g_sGUITitleBox_:gui))
                
    TextDrawShowForPlayer(playeridYSI_g_sGUITextTitle[_:gui][1]);

            
    // ---------------------------------------------------------------------

            // Maybe you can use y_iterate here
            
    for (new pospos MAX_GUI_ELEMENTSpos ++)
                if (
    Bit_Get(YSI_g_sGUIItemUsing[_:gui], pos))
                    
    TextDrawShowForPlayer(playeridYSI_g_sGUITextButton[_:gui][pos]);

            
    // ---------------------------------------------------------------------

            
    return 1;
        } 


    Ну мне понравилось :D А отступами я делаю как бы визуальные границы, которые оприделают как бы вызуальные группы.

    Код:
    forward AC_MoneyCore(playerid);
    public AC_MoneyCore(playerid) 
    {
    	
    	ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore", 1000, false, "i", playerid);
    	
    	if(GetPlayerMoney(playerid) != ac_money[playerid])
    	{	
    		ResetPlayerMoney(playerid);
    		GivePlayerMoney(playerid, ac_money[playerid]);
    	
    		#if defined OnMoneyCheatDetected
    			OnMoneyCheatDetected(playerid);		
    		#endif	
    		
    		return 1;
    	}	
    
    	return 0;
    }
    Код:
    public OnPlayerConnect(playerid) 
    {
    	ac_money[playerid] = 0;
    	
    	ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore", 1000, false, "i", playerid);
    	
    #if defined u_OnPlayerConnect
    	u_OnPlayerConnect(playerid);
    #endif
    	return 1;
    }
    // ...
    * строки, для работы с деньгами.
    * строки, для работы с таймером.

    Бзик у меня такой (в мою новую коллекцию :D)

    Все замечания учтутся, все исправим :)

 

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

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

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

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

Ваши права

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