Перейти к содержанию
Авторизация  
Anton_Styazhkin

Античит на деньги

Рекомендуемые сообщения

Anton_Styazhkin

U_AC_MONEY.INC

Античит на деньги от Anton_Styazhkin aka Untonyst

 

Хочу представим вам гибкий в настройке античит на деньги, написанный с использование ALS хуков (перехват нативных функций и каллбэков). 

 

Как работает античит. При любом несовпадение суммы денег игрока и суммы, записанной в античите, он будет срабатывать. Деньги будут списывать и будет вызван каллбэк «OnMoneyCheatDetected», конечно, если вы его указали. В зависимости от содержания этот каллбэка будет происходить «наказание» игрока за использование читов, или, оповещение администраторам о потенциальном читере. Ложных срабатываний пока не наблюдалось, по крайней мере меня как автора о них не извещали :D

 

Чтобы его подключить, вам просто надо в начале мода ко всем инклудам добавить

#include <u_ac_money>

При ложных срабатываниях, связанных с проблемами с сетью, высоким пингом или чем-нибудь еще, перед подключением инклуда добавим

#define AC_MONEY_IGNORE_TICK_TIME (значение) 
#include <u_ac_money>

Важно, чтобы значение было больше 1000. Если не выставлять это значение, то ставится значение по умолчанию - 1000.

 

Чтобы настроить индивидуально наказание, оповещение администраторам или что-нибудь еще, достаточно в моде добавить каллбэк OnMoneyCheatDetected

#include <u_ac_money> 

public OnMoneyCheatDetected(playerid) 
{ 
    SendClientMessage(playerid, -1, "Ваш баланс восстановлен. Администрация уже вкурсе!"); 
}  
 
Функция вызывается читером и не возвращает какого-либо конкретного значения.
 
 
Создайте файл в том же самом блокноте, потом на «сохранить как» и введите «u_ac_money.inc».
 
Если вам понравится такой представление античитов, то я с радостью продолжу разработку, если мне будет не лень и если я буду не занят.
  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Web

Код на пастебине умер.

 

Пример использования:

#include <zcmd> 
#include <sscanf2> 

CMD:checkplayer(playerid, params[]) 
{ 
    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(targetid, str, MAX_PLAYER_NAME); 
        format(str, sizeof str, fmt_str, str, targetid); 
        return SendClientMessage(playerid, -1, str); 
    } 
        return SendClientMessage(playerid, -1, !"Использование чита на деньги не обнаружено." 
    ); 
} 

Код инклуда:

/*
 * Copyright (c) 2016, Untonyst
 *
 * This software is provided 'as-is', without any express or implied
 * warranty. In no event will the authors be held liable for any damages
 * arising from the use of this software.
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 * 1. The origin of this software must not be misrepresented; you must not
 * claim that you wrote the original software. If you use this software
 * in a product, an acknowledgement in the product documentation would be
 * appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */

#if !defined _samp_included
    #include <a_samp>
#endif

#if defined _u_acm_included
    #endinput
#endif
#define _u_acm_included

#if !defined AC_MONEY_IGNORE_TIME
    #define AC_MONEY_IGNORE_TIME (1000)
#endif

static ac_money[MAX_PLAYERS];
static ignore_tick[MAX_PLAYERS];

public OnPlayerDisconnect(playerid, reason)
{
    ac_money[playerid] = ignore_tick[playerid] = 0;
    #if defined u_acm__OnPlayerDisconnect
        u_acm__OnPlayerDisconnect(playerid, reason);
    #endif
    return 1;
}
#if defined _ALS_OnPlayerDisconnect
    #undef OnPlayerDisconnect
#else
    #define _ALS_OnPlayerDisconnect
#endif
#if defined u_acm__OnPlayerDisconnect
forward u_acm__OnPlayerDisconnect(playerid, reason);
#endif
#define OnPlayerDisconnect u_acm__OnPlayerDisconnect

stock CheckPlayerOnMoney(playerid, call=0)
{
    new money = GetPlayerMoney(playerid);
    if(ac_money[playerid] == money)
        return 0;
    if((ac_money[playerid] > money)
    && (GetTickCount() > ignore_tick[playerid]))
    {
        ac_money[playerid] = money;
    }
    if(call > 0)
    {
        #if defined OnMoneyCheatDetected
            CallLocalFunction(!"OnMoneyCheatDetected", !"iii",
                playerid, money - ac_money[playerid], ac_money[playerid]
            );
        #endif
        ResetPlayerMoney(playerid);
        GivePlayerMoney(playerid, ac_money[playerid]);
    }
    return 1;
}

stock u_acm__GivePlayerMoney(playerid, money)
{
    ignore_tick[playerid] = GetTickCount() + AC_MONEY_IGNORE_TIME;
    ac_money[playerid] += money;
    return GivePlayerMoney(playerid, money);
}
#if defined _ALS_GivePlayerMoney
    #undef GivePlayerMoney
#else
    #define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney u_acm__GivePlayerMoney

stock u_acm__GetPlayerMoney(playerid)
    return ac_money[playerid];
#if defined _ALS_GetPlayerMoney
    #undef GetPlayerMoney
#else
    #define _ALS_GetPlayerMoney
#endif
#define GetPlayerMoney u_acm__GetPlayerMoney

stock u_acm__ResetPlayerMoney(playerid)
{
    ac_money[playerid] = 0;
    return ResetPlayerMoney(playerid);
}
#if defined _ALS_ResetPlayerMoney
    #undef ResetPlayerMoney
#else
    #define _ALS_ResetPlayerMoney
#endif
#define ResetPlayerMoney u_acm__ResetPlayerMoney

#if defined OnMoneyCheatDetected
forward OnMoneyCheatDetected(playerid, cheat_money, money);
#endif

Запилите в первый пост.

Изменено пользователем Веб

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Anton_Styazhkin
      От Anton_Styazhkin
      U_DONATE.INC ядро донат-системы     Здравствуйте, мне часто писали в ЛС в ВКонтакте с просьбой написать/переделать их систему доната. Я стал озадачен целью создания библиотеки, которая бы упростила бы вам жизнь, мои дорогие новички в скриптинге. На данный момент библиотека находятся находится в стадии бета разработки и имеет несколько функций:   TextDraw: UpdateDonateTextDraw(игрок) - обновляет донат-счетчик (TextDraw) HideDonateTextDraw(игрок) - скрывает донат-счетчик (TextDraw) ShowDonateTextDraw(игрок) - показывает донат-счетчик (TextDraw)   Деньги: ResetPlayerDonateMoney(игрок) - обнуляет количество донат-денег SetPlayerDonateMoney(игрок, сумма) - устанавливает количество донат-денег GetPlayerDonateMoney(игрок) - получает количество донат-денег GivePlayerDonateMoney(игрок, сумма) - выдает донат-деньги   По традиции небольшой пример: Напишем донат-панель с тримя пунктами: сменить имя, обменять донат-деньги на игровые и купить скин.   #include <dc_cmd> #include <sscanf2> #include <u_donate> // :3 enum e_PLAYERS { name[MAX_PLAYER_NAME], money, skin }; new player[MAX_PLAYERS][e_PLAYERS]; COMMAND:donate(playerid) { ShowPlayerDialog(playerid, 0, DIALOG_STYLE_LIST, "Донат", "{FFFFFF}Изменить имя\nОбменять на деньги\nИзменить скин", "Выбрать", "Отмена"); } COMMAND:give_donate(playerid, params[]) { if(sscanf(params, "i", params[0])) return 0; GivePlayerDonateMoney(playerid, params[0]); UpdateDonateTextDraw(playerid); ShowDonateTextDraw(playerid); return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case 0: { if(!response) return 0; if(response) { switch(listitem) { case 0: { if(GetPlayerDonateMoney(playerid) < 15) { SendClientMessage(playerid, -1, "У вас недостаточно донат-денег !"); return 0; } ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "../изменить имя", "{FFFFFF}Введите новое имя.", "Купить", "Отмена"); } case 1: { if(GetPlayerDonateMoney(playerid) <= 0) { SendClientMessage(playerid, -1, "Вам нечего менять ((99"); return 0; } ShowPlayerDialog(playerid, 2, DIALOG_STYLE_MSGBOX, "../обменять на деньги", "{FFFFFF}Вы действительно хотите обменять донат-деньги?", "Да", "Нет"); } case 2: { if(GetPlayerDonateMoney(playerid) < 75) { SendClientMessage(playerid, -1, "У вас недостаточно донат-денег !"); return 0; } ShowPlayerDialog(playerid, 3, DIALOG_STYLE_INPUT, "../изменить скин", "{FFFFFF}Укажите номер скина, который хотите получить.", "Да", "Нет"); } } } } case 1: { if(!response) return 0; if(response) { if(!strlen(inputtext)) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "../изменить имя", "{FFFFFF}Введите новое имя.", "Купить", "Отмена"); if(strlen(inputtext) < MAX_PLAYER_NAME - 18 && strlen(inputtext) > MAX_PLAYER_NAME) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "../изменить имя", "{FFFFFF}Введите новое имя.", "Купить", "Отмена"); for(new i = strlen(inputtext) - 1; i != -1; i--) if((inputtext[i] >= 'a' && inputtext[i] <= 'z') || (inputtext[i] >= 'A' && inputtext[i] <= 'Z') || (inputtext[i] == '_')) continue; else return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "../изменить имя", "{FFFFFF}Введите новое имя.", "Купить", "Отмена"); sscanf(inputtext, "s[24]", player[playerid][name]); SetPlayerName(playerid, player[playerid][name]); static const str[] = "Вы сменили имя на %s"; new ftm_str[sizeof(str) + (-2) + MAX_PLAYER_NAME]; format(ftm_str, sizeof(ftm_str), str, player[playerid][name]); SendClientMessage(playerid, -1, ftm_str); SetPlayerDonateMoney(playerid, GetPlayerDonateMoney(playerid) - 15); UpdateDonateTextDraw(playerid); GameTextForPlayer(playerid, "~r~-$15", 2000, 5); } } case 2: { if(!response) return 0; if(response) { static const str[] = "~g~+$%i"; new ftm_str[sizeof(str) + (-2) + 8]; format(ftm_str, sizeof(ftm_str), str, GetPlayerDonateMoney(playerid)); GameTextForPlayer(playerid, ftm_str, 2000, 5); GivePlayerMoney(playerid, GetPlayerDonateMoney(playerid)); ResetPlayerDonateMoney(playerid); UpdateDonateTextDraw(playerid); SendClientMessage(playerid, -1, "Вы обменяли донат-деньги на игровые!"); } } case 3: { if(!response) return 0; if(response) { new old_skin; old_skin = player[playerid][skin]; sscanf(inputtext, "i", player[playerid][skin]); if(old_skin == player[playerid][skin]) { player[playerid][skin] = old_skin; SetPlayerSkin(playerid, player[playerid][skin]); return 0; } SetPlayerDonateMoney(playerid, GetPlayerDonateMoney(playerid) - 75); GameTextForPlayer(playerid, "~r~-$75", 2000, 5); UpdateDonateTextDraw(playerid); SetPlayerSkin(playerid, player[playerid][skin]); SendClientMessage(playerid, -1, "Вы изменили скин!"); } } } return 1; } Скачать (click).
       
      Автор: Anton_Styazhkin aka Untonyst ;)
       
      Можете предлагать все ваши идеи, все учту.
×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.