Advanced Client Checker

Advanced Client Checker 0.3.6

Нет прав для скачивания
Сообщения
576
Реакции
1,003
Помог
18 раз(а)
ncux0Zz, я не занимаюсь составлением баз, ищите консультации в топиках с базами.
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
Mistrick, я не прошу составить мне базу, я ее сам и составлю.
Мне нужно понять полноценно работу конфигов, то что вы отписались давиче, там всё понятно, вот только я не понимаю, почему плагин банит игроков за то, чего нет у них.
Например, команда "+reaimkill", банит всех, как будто есть она. Хотя она считывается из cmds.cfg как вы сказали, точность должна быть один в один, а такое ощущение, что она просто находит "kill" у каждого клиента команду и банит по ошибки за нее, я пытаюсь разобраться в работоспособности плагина, базу я и сам составлю полноценно.
 
Сообщения
2,291
Реакции
1,737
Помог
31 раз(а)
ncux0Zz, в базе идет проверка на aim. Но смысл гадать нам? Мы же не знаем что за база у Вас. И как вам сказали вам лучше пойти в раздел где собирается база
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
Pokemoshka, да я полностью понимаю, что обозначают эти команды)
у меня нет базы, я её толко пишу, но прежде чем писать, понять куда лучше и какие заносить команды из логов от чита: в bad_cmds.cfg или cmds.cfg

Почему-то ни кто не скажет, это баг плагина или так и надо, чтобы он срабатывал на команды, которых нет у клиента, но в этой команде есть работоспособная команда другая. Пример выше писал.
 
Сообщения
576
Реакции
1,003
Помог
18 раз(а)
ncux0Zz,
Почему-то ни кто не скажет, это баг плагина или так и надо, чтобы он срабатывал на команды, которых нет у клиента, но в этой команде есть работоспособная команда другая. Пример выше писал.
Для этого надо создать топик и прикрепить всю информацию о серве, настройки, логи. Высасывать из вас это здесь никому не надо.
понять куда лучше и какие заносить команды из логов от чита: в bad_cmds.cfg или cmds.cfg
Для этого и есть топик со сбором базы. Я в теме почти весь плагин словами описал.
 
Сообщения
321
Реакции
73
Помог
11 раз(а)
L 01/19/2019 - 14:10:20: Invalid index 3 (count: 3)
L 01/19/2019 - 14:10:20: [AMXX] Displaying debug trace (plugin "cmdchecker.amxx", version "0.3.6")
L 01/19/2019 - 14:10:20: [AMXX] Run time error 10: native error (native "ArrayGetArray")
L 01/19/2019 - 14:10:20: [AMXX] [0] cmdchecker.sma::punishment (line 635)
L 01/19/2019 - 14:10:20: [AMXX] [1] cmdchecker.sma::cvar_callback (line 533)
 
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
Прикладываю небольшой баг-репорт.

1:
Код:
L 02/13/2019 - 14:50:21: String formatted incorrectly - parameter 3 (total 2)
L 02/13/2019 - 14:50:21: [AMXX] Displaying debug trace (plugin "cmdchecker.amxx", version "0.3.6")
L 02/13/2019 - 14:50:21: [AMXX] Run time error 25: parameter error
L 02/13/2019 - 14:50:21: [AMXX]    [0] cmdchecker.sma::send_next_cmd (line 503)
L 02/13/2019 - 14:50:21: [AMXX]    [1] cmdchecker.sma::client_command (line 446)
Данная ошибка появилась после включения мной функции логирования команд.

2: Вторая ошибка связана тоже с логированием, иногда каким-то образом в лог попадают команды из файла cmds.cfg, при этом там не указывается игрока, у которого якобы эта команда была обнаружена.

Выглядит это так:

1550058888545.png

1550058934342.png
13 Фев 2019
Забыл отметить, что у меня логи вынесены в файл, поэтому номера строк будут отличаться.
Код:
#include <amxmodx>

#define PLUGIN "Advanced Client Checker"
#define VERSION "0.3.6"
#define AUTHOR "Mistrick"

#pragma semicolon 1

///******** Settings ********///

// #define KICK_BAD_CLIENT // кик за блокировку подтверждения
// #define KICK_FOR_BLOCK_CVAR_ANSWER // кик за блок ответа на запрос квара
#define COMMAND_LOGGER // функция логирования написанных в консоль команд игроком

#define INPUT_DELAY 3.0 // задержка проверки после коннекта
#define RECHECK_DELAY 300.0 // через сколько начать повторную проверку
#define MAX_CMDS_FOR_LOOP 1000 // сколько команд проверять за цикл
#define LOOP_DELAY 5.0 // задержка между циклами
#define FIRST_ANSWER_MAX_TIME 5.0 // время на ответ от команды подтверждения
#define FIRST_CMD_RECHECKS 5
#define MAX_CMD_WARNINGS 5

#define CVAR_ANSWER_TIME 5.0 // время на ответ от квара
#define CVAR_ANSWER_RECHECKS 5 // число перепроверок на запрос квара

new const g_szLogFolder[] = "ACC"; // папка в amxmodx/logs/ куда будут идти логи

///**************************///

enum ( +=100 ) {
    TASK_FIRST_CMD = 100,
    TASK_CMD_CHECK,
    TASK_CVAR_ANSWER,
    TASK_CVAR_CHECK
};

enum CvarFlags ( <<= 1 ) {
    CVAR_EXIST = 1,
    CVAR_NOT_EXIST,
    CVAR_EQUAL,
    CVAR_NOT_EQUAL,
    CVAR_ABOVE,
    CVAR_BELOW
}

enum PunishType {
    PUNISH_BAD_CLIENT,
    PUNISH_BLOCK_CVAR_ANSWER,
    PUNISH_WRONG_CMD,
    PUNISH_WRONG_CVAR,
    PUNISH_BAD_CMD
};

enum _:CommandStruct {
    _CmdPunishLevel,
    _Cmd[64]
};

enum _:CvarStruct {
    _CvarPunishLevel,
    CvarFlags:_CvarFlags,
    _Cvar[64],
    _CvarValue[32],
    Float:_CvarValueAbove,
    Float:_CvarValueBelow
};

enum BadCmdFlags ( <<= 1 ) {
    BADCMD_ANY = 1,
    BADCMD_PREFIX,
    BADCMD_SUFFIX
};

enum _:BadCmdStruct {
    _BadCmdPunishLevel,
    BadCmdFlags:_BadCmdFlags,
    _BadCmd[64]
};

enum _:PunishStruct {
    _PunishLevel,
    _PunishCmd[128]
};

#define CMD_LEN 8
#define INVALID_INDEX -1

new const FILE_CMD_CFG[] = "cmds.cfg";
new const FILE_CVAR_CFG[] = "cvars.cfg";
new const FILE_BAD_CMD_CFG[] = "bad_cmds.cfg";
new const FILE_PUNISH_CFG[] = "punish.cfg";
new const FILE_SLOWHACK_ANSWER_CFG[] = "slowhackanswer.cfg";

new player_ip[33][16];
new player_authid[33][32];
new bool:is_player_steam[33];

new bool:client_answered[33];
new client_answer_check[33];
new client_cmd_warnings[33];
new current_cmd_state[33];
new current_cmd[33][64];
new bool:first_check[33];
new rnd_str[33][CMD_LEN];

new Array:g_aCmdList;
new g_iCmdListSize;

new Array:g_aBadCmdList;
new g_iBadCmdListSize;
new current_bad_cmd[33];

new current_cvar_state[33];
new client_cvar_warnings[33];

new Array:g_aCvarList;
new g_iCvarListSize;

new Array:g_aPunishList;

new Trie:g_tSlowhackAnswer;
new g_iSlowhackAnswerSize;

#if defined COMMAND_LOGGER
new const FILE_CMD_LOG[] = "cmdlog.cfg";
new Trie:g_tCmdLog;
new g_szCmdLogPath[260];
#endif // COMMAND_LOGGER

new g_szLogFile[PLATFORM_MAX_PATH];

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    register_concmd("acc_add_cmd", "command_add_cmd", ADMIN_RCON);
    register_concmd("acc_add_cvar", "command_add_cvar", ADMIN_RCON);
    register_concmd("acc_add_bad_cmd", "command_add_bad_cmd", ADMIN_RCON);
    register_concmd("acc_add_punish", "command_add_punish", ADMIN_RCON);
    register_concmd("acc_add_slowhack_answer", "command_add_slowhack_answer", ADMIN_RCON);
  
    g_aCmdList = ArrayCreate(CommandStruct, 1);
    g_aCvarList = ArrayCreate(CvarStruct, 1);
    g_aBadCmdList = ArrayCreate(BadCmdStruct, 1);
    g_aPunishList = ArrayCreate(PunishStruct, 1);
    g_tSlowhackAnswer = TrieCreate();
  
    #if defined COMMAND_LOGGER
    register_concmd("acc_add_cmd_log", "command_add_cmd_log", ADMIN_RCON);
    g_tCmdLog = TrieCreate();
    #endif // COMMAND_LOGGER
  
    new szBuff[PLATFORM_MAX_PATH], szLogsDir[PLATFORM_MAX_PATH];
    get_localinfo("amxx_logs", szLogsDir, charsmax(szLogsDir));

    formatex(szBuff, charsmax(szBuff), "%s/%s", szLogsDir, g_szLogFolder);

    if(!dir_exists(szBuff))
        mkdir(szBuff);

    add(szBuff, charsmax(szBuff), "/ACC%d%m%Y.log");
    get_time(szBuff, g_szLogFile, charsmax(g_szLogFile));
}
public plugin_cfg()
{
    new file_dir[256]; get_localinfo("amxx_configsdir", file_dir, charsmax(file_dir));

    server_cmd("exec %s/cmdchecker/%s", file_dir, FILE_CMD_CFG);
    server_cmd("exec %s/cmdchecker/%s", file_dir, FILE_CVAR_CFG);
    server_cmd("exec %s/cmdchecker/%s", file_dir, FILE_BAD_CMD_CFG);
    server_cmd("exec %s/cmdchecker/%s", file_dir, FILE_PUNISH_CFG);
    server_cmd("exec %s/cmdchecker/%s", file_dir, FILE_SLOWHACK_ANSWER_CFG);
  
    #if defined COMMAND_LOGGER
    formatex(g_szCmdLogPath, charsmax(g_szCmdLogPath), "%s/cmdchecker/%s", file_dir, FILE_CMD_LOG);
    server_cmd("exec %s", g_szCmdLogPath);
    #endif // COMMAND_LOGGER
}
public plugin_end()
{
    ArrayDestroy(g_aCmdList);
    ArrayDestroy(g_aCvarList);
    ArrayDestroy(g_aPunishList);
  
    #if defined COMMAND_LOGGER
    TrieDestroy(g_tSlowhackAnswer);
    #endif // COMMAND_LOGGER
}
public command_add_cmd(id, level, cid)
{
    if(~get_user_flags(id) & level) {
        return PLUGIN_HANDLED;
    }
  
    if(read_argc() != 3) {
        return PLUGIN_HANDLED;
    }
  
    new cmd_info[CommandStruct], args[16];
    read_argv(1, args, charsmax(args));
    cmd_info[_CmdPunishLevel] = str_to_num(args);
    read_argv(2, cmd_info[_Cmd], charsmax(cmd_info[_Cmd]));
    trim(cmd_info[_Cmd]);
  
    ArrayPushArray(g_aCmdList, cmd_info);
    g_iCmdListSize++;
  
    return PLUGIN_HANDLED;
}
public command_add_cvar(id, level, cid)
{
    if(~get_user_flags(id) & level) {
        return PLUGIN_HANDLED;
    }
  
    new args_num = read_argc() - 1;
  
    if(args_num < 3) {
        return PLUGIN_HANDLED;
    }
  
    new cvar_info[CvarStruct], args[16];
    read_argv(1, args, charsmax(args));
    cvar_info[_CvarPunishLevel] = str_to_num(args);
  
  
    // find this cvar in array
    // if exists update cvar flags
  
    read_argv(2, cvar_info[_Cvar], charsmax(cvar_info[_Cvar]));
    trim(cvar_info[_Cvar]);
    strtolower(cvar_info[_Cvar]);
  
    read_argv(3, args, charsmax(args));
  
    if(args_num == 3) {
        if(equal(args, "exist")) {
            cvar_info[_CvarFlags] |= CVAR_EXIST;
        } else if(equal(args, "!exist")) {
            cvar_info[_CvarFlags] |= CVAR_NOT_EXIST;
        }
    } else if(args_num == 4) {
        if(equal(args, "equal") || equal(args, "==") || equal(args, ">=") || equal(args, "<=")) {
            cvar_info[_CvarFlags] |= CVAR_EQUAL;
            read_argv(4, cvar_info[_CvarValue], charsmax(cvar_info[_CvarValue]));
        } else if(equal(args, "!equal") || equal(args, "!=")) {
            cvar_info[_CvarFlags] |= CVAR_NOT_EQUAL;
            read_argv(4, cvar_info[_CvarValue], charsmax(cvar_info[_CvarValue]));
        }
      
        if(equal(args, ">") || equal(args, ">=")) {
            cvar_info[_CvarFlags] |= CVAR_ABOVE;
            read_argv(4, args, charsmax(args));
            cvar_info[_CvarValueAbove] = _:str_to_float(args);
        } else if(equal(args, "<") || equal(args, "<=")) {
            cvar_info[_CvarFlags] |= CVAR_BELOW;
            read_argv(4, args, charsmax(args));
            cvar_info[_CvarValueBelow] = _:str_to_float(args);
        }
    }
  
    if(cvar_info[_CvarFlags]) {
        ArrayPushArray(g_aCvarList, cvar_info);
        g_iCvarListSize++;
    }
  
    return PLUGIN_HANDLED;
}

public command_add_bad_cmd(id, level, cid)
{
    if(~get_user_flags(id) & level) {
        return PLUGIN_HANDLED;
    }
  
    if(read_argc() < 3) {
        return PLUGIN_HANDLED;
    }
  
    new bad_cmd_info[BadCmdStruct], args[16];
    read_argv(1, args, charsmax(args));
    bad_cmd_info[_BadCmdPunishLevel] = str_to_num(args);
  
    new command[64], len;
    len = read_argv(2, command, charsmax(command));
  
    if(command[0] == '*' && command[len - 1] == '*') {
        bad_cmd_info[_BadCmdFlags] = _:BADCMD_ANY;
        command[len - 1] = 0;
        copy(bad_cmd_info[_BadCmd], charsmax(bad_cmd_info[_BadCmd]), command[1]);
    } else if(command[0] != '*' && command[len - 1] != '*') {
        bad_cmd_info[_BadCmdFlags] = _:BADCMD_ANY;
        copy(bad_cmd_info[_BadCmd], charsmax(bad_cmd_info[_BadCmd]), command);
    } else if(command[0] == '*') {
        bad_cmd_info[_BadCmdFlags] = _:BADCMD_SUFFIX;
        copy(bad_cmd_info[_BadCmd], charsmax(bad_cmd_info[_BadCmd]), command[1]);
    } else if(command[len - 1] == '*') {
        bad_cmd_info[_BadCmdFlags] = _:BADCMD_PREFIX;
        command[len - 1] = 0;
        copy(bad_cmd_info[_BadCmd], charsmax(bad_cmd_info[_BadCmd]), command);
    }
  
    ArrayPushArray(g_aBadCmdList, bad_cmd_info);
    g_iBadCmdListSize++;
  
    return PLUGIN_HANDLED;
}

public command_add_punish(id, level, cid)
{
    if(~get_user_flags(id) & level) {
        return PLUGIN_HANDLED;
    }
  
    if(read_argc() != 3) {
        return PLUGIN_HANDLED;
    }
  
    new punish_info[PunishStruct], args[16];
    read_argv(1, args, charsmax(args));
    punish_info[_PunishLevel] = str_to_num(args);
    read_argv(2, punish_info[_PunishCmd], charsmax(punish_info[_PunishCmd]));
  
    ArrayPushArray(g_aPunishList, punish_info);
  
    return PLUGIN_HANDLED;
}
public command_add_slowhack_answer(id, level, cid)
{
    if(~get_user_flags(id) & level) {
        return PLUGIN_HANDLED;
    }
  
    new args[64]; read_args(args, charsmax(args));
    remove_quotes(args); trim(args);
    TrieSetCell(g_tSlowhackAnswer, args, 1);
    g_iSlowhackAnswerSize++;
  
    return PLUGIN_HANDLED;
}

#if defined COMMAND_LOGGER
public command_add_cmd_log(id, level, cid)
{
    if(~get_user_flags(id) & level) {
        return PLUGIN_HANDLED;
    }
  
    new args[64]; read_args(args, charsmax(args));
    remove_quotes(args); trim(args);
    TrieSetCell(g_tCmdLog, args, 1);
  
    return PLUGIN_HANDLED;
}
#endif // COMMAND_LOGGER

public client_putinserver(id)
{
    if(is_user_bot(id) || is_user_hltv(id)) return;
  
    is_player_steam[id] = is_user_steam(id);
  
    if(g_iCmdListSize) {
        client_answer_check[id] = 0;
        set_task(INPUT_DELAY + random_float(0.5, 1.5), "init_cmd_check", id + TASK_CMD_CHECK);
    }
  
    if(g_iCvarListSize) {
        set_task(INPUT_DELAY + random_float(1.5, 3.5), "init_cvar_check", id + TASK_CVAR_CHECK);
    }
  
    get_user_authid(id, player_authid[id], charsmax(player_authid[]));
    get_user_ip(id, player_ip[id], charsmax(player_ip[]), 1);
}
public client_disconnected(id)
{
    remove_task(id + TASK_CMD_CHECK);
    remove_task(id + TASK_FIRST_CMD);
    remove_task(id + TASK_CVAR_ANSWER);
    remove_task(id + TASK_CVAR_CHECK);
}
public init_cmd_check(id)
{
    id -= TASK_CMD_CHECK;
  
    first_check[id] = true;
    current_cmd_state[id] = -1;
    client_answered[id] = true;
    client_cmd_warnings[id] = 0;
  
    generate_string(rnd_str[id], charsmax(rnd_str[]));
    client_cmd(id, rnd_str[id]);
    set_task(FIRST_ANSWER_MAX_TIME, "check_first_cmd", id + TASK_FIRST_CMD);
}
public check_first_cmd(id)
{
    // client without answer
    id -= TASK_FIRST_CMD;
  
    if(++client_answer_check[id] >= FIRST_CMD_RECHECKS) {
        punishment(id, PUNISH_BAD_CLIENT);
    } else {
        init_cmd_check(id + TASK_CMD_CHECK);
    }
}
public client_command(id)
{
    new cmd[64]; read_argv(0, cmd, charsmax(cmd));

    if(current_cmd_state[id] >= 0 && equal(cmd, current_cmd[id])) {
        client_answered[id] = true;
        return PLUGIN_HANDLED;
    }
  
    if(g_iSlowhackAnswerSize && !client_answered[id] && TrieKeyExists(g_tSlowhackAnswer, cmd)) {
        // slowhack answer
        client_answered[id] = true;
        return PLUGIN_HANDLED;
    }
  
    if(equal(rnd_str[id], cmd)) {
        if(first_check[id]) {
            first_check[id] = false;
            remove_task(id + TASK_FIRST_CMD);
        }
        // send next cmd
        generate_string(rnd_str[id], charsmax(rnd_str[]));
        if(client_answered[id]) {
            client_answered[id] = false;
          
            if(++current_cmd_state[id] >= g_iCmdListSize) {
                set_task(RECHECK_DELAY + random_float(0.0, 30.0), "init_cmd_check", id + TASK_CMD_CHECK);
                return PLUGIN_HANDLED;
            }
            // add delay if too match cmds
            // 50-100 cmds for one cycle
            if(current_cmd_state[id] && !(current_cmd_state[id] % MAX_CMDS_FOR_LOOP)) {
                set_task(LOOP_DELAY, "send_next_cmd", id);
                return PLUGIN_HANDLED;
            }
        } else {
            if(++client_cmd_warnings[id] >= MAX_CMD_WARNINGS) {
                punishment(id, PUNISH_WRONG_CMD);
                return PLUGIN_HANDLED;
            }
        }
        send_next_cmd(id);
        return PLUGIN_HANDLED;
    }
  
    if(g_iBadCmdListSize) {
        new bad_cmd_info[BadCmdStruct];
        new result;
      
        new cmd_len = strlen(cmd), bad_cmd_len;
      
        for(new i; i < g_iBadCmdListSize; i++) {
            ArrayGetArray(g_aBadCmdList, i, bad_cmd_info);
          
            result = containi(cmd, bad_cmd_info[_BadCmd]);
          
            if(result == -1) {
                continue;
            }
          
            current_bad_cmd[id] = i;
            bad_cmd_len = strlen(bad_cmd_info[_BadCmd]);
          
            // log_to_file(g_szLogFile,"[ACC] found bad cmd: %s, pattern: %s. STEAM: %s", cmd, bad_cmd_info[_BadCmd], player_authid[id]);
            // punishment(id, PUNISH_BAD_CMD);
          
            if(!result && cmd_len > bad_cmd_len && bad_cmd_info[_BadCmdFlags] & BADCMD_PREFIX) {
                log_player(id, "found prefix bad cmd: ^"%s^", pattern: ^"%s^"", cmd, bad_cmd_info[_BadCmd]);
                punishment(id, PUNISH_BAD_CMD);
                return PLUGIN_HANDLED;
            } else if(cmd_len - result == bad_cmd_len && cmd_len > bad_cmd_len  && bad_cmd_info[_BadCmdFlags] & BADCMD_SUFFIX) {
                log_player(id, "found suffix bad cmd: ^"%s^", pattern: ^"%s^"", cmd, bad_cmd_info[_BadCmd]);
                punishment(id, PUNISH_BAD_CMD);
                return PLUGIN_HANDLED;
            } else if(bad_cmd_info[_BadCmdFlags] & BADCMD_ANY) {
                log_player(id, "found bad cmd: ^"%s^", pattern: ^"%s^"", cmd, bad_cmd_info[_BadCmd]);
                punishment(id, PUNISH_BAD_CMD);
                return PLUGIN_HANDLED;
            }
        }
    }
  
    #if defined COMMAND_LOGGER
    if(!TrieKeyExists(g_tCmdLog, cmd)) {
        add_new_cmd(id, cmd);
    }
    #endif // COMMAND_LOGGER
  
    return PLUGIN_CONTINUE;
}
public send_next_cmd(id)
{
    new cmd_info[CommandStruct]; ArrayGetArray(g_aCmdList, current_cmd_state[id], cmd_info);
    copy(current_cmd[id], charsmax(current_cmd[]), cmd_info[_Cmd]);
  
    if(is_player_steam[id])
        send_director_cmd(id, current_cmd[id]);
    else
        client_cmd(id, current_cmd[id]);
  
    client_cmd(id, rnd_str[id]);
}


public init_cvar_check(id)
{
    id -= TASK_CVAR_CHECK;

    current_cvar_state[id] = 0;
    client_cvar_warnings[id] = 0;
  
    send_next_cvar(id);
}

public send_next_cvar(id)
{
    new cvar_info[CvarStruct]; ArrayGetArray(g_aCvarList, current_cvar_state[id], cvar_info);
    query_client_cvar(id, cvar_info[_Cvar], "cvar_callback", 1, _:cvar_info[_CvarFlags]);
    set_task(CVAR_ANSWER_TIME, "cvar_answer", id + TASK_CVAR_ANSWER);
}

public cvar_answer(id)
{
    id -= TASK_CVAR_ANSWER;
  
    if(++client_cvar_warnings[id] >= CVAR_ANSWER_RECHECKS) {
        punishment(id, PUNISH_BLOCK_CVAR_ANSWER);
    } else {
        send_next_cvar(id);
    }
}

public cvar_callback(id, cvar[], value[], params[])
{
    remove_task(id + TASK_CVAR_ANSWER);
  
    new CvarFlags:flags = CvarFlags:params[0];
  
    if(flags & (CVAR_EXIST|CVAR_NOT_EXIST)) {
        new eq = equal(value, "Bad CVAR request");
        if(!eq && flags & CVAR_EXIST) {
            // punish for exist cvar
            log_player(id, "found bad cvar: ^"%s^"", cvar);
            punishment(id, PUNISH_WRONG_CVAR);
            return PLUGIN_HANDLED;
        }
        if(eq && flags & CVAR_NOT_EXIST) {
            // punish for not exist cvar
            log_player(id, "where is your cvar: ^"%s^"", cvar);
            punishment(id, PUNISH_WRONG_CVAR);
            return PLUGIN_HANDLED;
        }
    }

    if(current_cvar_state[id] >= ArraySize(g_aCvarList)) {
        log_to_file(g_szLogFile, "[ACC] Undefined behavior. Cvar: ^"%s^", value: ^"%s^", flags: %d", cvar, value, flags);
        return PLUGIN_HANDLED;
    }

    new cvar_info[CvarStruct]; ArrayGetArray(g_aCvarList, current_cvar_state[id], cvar_info);
  
    if(flags & (CVAR_EQUAL|CVAR_NOT_EQUAL)) {
        if((equali(value, cvar_info[_CvarValue]) || str_to_float(value) == str_to_float(cvar_info[_CvarValue])) && flags & CVAR_EQUAL) {
            log_player(id, "found equal cvar value: ^"%s^" %s == %s", cvar, value, cvar_info[_CvarValue]);
            punishment(id, PUNISH_WRONG_CVAR);
            return PLUGIN_HANDLED;
        } else if(flags & CVAR_NOT_EQUAL) {
            log_player(id, "found not equal cvar value: ^"%s^" %s != %s", cvar, value, cvar_info[_CvarValue]);
            punishment(id, PUNISH_WRONG_CVAR);
            return PLUGIN_HANDLED;
        }
    }
  
    if(flags & CVAR_ABOVE && str_to_float(value) > cvar_info[_CvarValueAbove]) {
        log_player(id, "found cvar value: ^"%s^" %s > %.1f", cvar, value, cvar_info[_CvarValueAbove]);
        punishment(id, PUNISH_WRONG_CVAR);
        return PLUGIN_HANDLED;
    }
  
    if(flags & CVAR_BELOW && str_to_float(value) < cvar_info[_CvarValueBelow]) {
        log_player(id, "found cvar value: ^"%s^" %s < %.1f", cvar, value, cvar_info[_CvarValueBelow]);
        punishment(id, PUNISH_WRONG_CVAR);
        return PLUGIN_HANDLED;
    }
  
    if(++current_cvar_state[id] >= g_iCvarListSize) {
        set_task(RECHECK_DELAY, "init_cvar_check", id + TASK_CVAR_CHECK);
        return PLUGIN_HANDLED;
    }
    send_next_cvar(id);
  
    return PLUGIN_HANDLED;
}

#if defined COMMAND_LOGGER
add_new_cmd(id, cmd[])
{
    TrieSetCell(g_tCmdLog, cmd, 1);
    new name[32], text[256];
    get_user_name(id, name, charsmax(name));
    formatex(text, charsmax(text), "// cmd: ^"%s^", player: %s, steamid: %s, ip: %s^nacc_add_cmd_log ^"%s^"", cmd, name, player_authid[id], player_ip[id], cmd);
    write_file(g_szCmdLogPath, text);
}
#endif // COMMAND_LOGGER

punishment(id, PunishType:type)
{
    // ban, kick, etc...
    new punish_index, reason[32];
  
    switch(type) {
        case PUNISH_BAD_CLIENT: {
            // bad client, protector
            log_player(id, "found bad client or protector");
          
            #if defined KICK_BAD_CLIENT
            server_cmd("kick #%d Bad Client", get_user_userid(id));
            #endif
          
            return;
        }
        case PUNISH_BLOCK_CVAR_ANSWER: {
            new cvar_info[CvarStruct]; ArrayGetArray(g_aCvarList, current_cvar_state[id], cvar_info);
            log_player(id, "cvar without answer: %s", cvar_info[_Cvar]);
      
            #if defined KICK_FOR_BLOCK_CVAR_ANSWER
            server_cmd("kick #%d Block Cvar", get_user_userid(id));
            #endif
          
            return;
        }
        case PUNISH_WRONG_CMD: {
            log_player(id, "found wrong cmd: ^"%s^"", current_cmd[id]);
          
            new cmd_info[CommandStruct]; ArrayGetArray(g_aCmdList, current_cmd_state[id], cmd_info);
            punish_index = get_punish_index(cmd_info[_CmdPunishLevel]);
          
            if(punish_index == INVALID_INDEX) {
                log_to_file(g_szLogFile, "[ACC] Can't find ^"%d^" punish level for ^"%s^".", cmd_info[_CmdPunishLevel], cmd_info[_Cmd]);
                return;
            }
          
            copy(reason, charsmax(reason), cmd_info[_Cmd]);
        }
        case PUNISH_WRONG_CVAR: {
            new cvar_info[CvarStruct]; ArrayGetArray(g_aCvarList, current_cvar_state[id], cvar_info);
            punish_index = get_punish_index(cvar_info[_CvarPunishLevel]);
          
            if(punish_index == INVALID_INDEX) {
                log_to_file(g_szLogFile, "[ACC] Can't find ^"%d^" punish level for ^"%s^".", cvar_info[_CvarPunishLevel], cvar_info[_Cvar]);
                return;
            }
          
            copy(reason, charsmax(reason), cvar_info[_Cvar]);
        }
        case PUNISH_BAD_CMD: {
            new bad_cmd_info[BadCmdStruct]; ArrayGetArray(g_aBadCmdList, current_bad_cmd[id], bad_cmd_info);
            punish_index = get_punish_index(bad_cmd_info[_BadCmdPunishLevel]);
          
            if(punish_index == INVALID_INDEX) {
                log_to_file(g_szLogFile, "[ACC] Can't find ^"%d^" punish level for ^"%s^".", bad_cmd_info[_BadCmdPunishLevel], bad_cmd_info[_BadCmd]);
                return;
            }
          
            copy(reason, charsmax(reason), bad_cmd_info[_BadCmd]);
        }
    }
  
    new punish_info[PunishStruct]; ArrayGetArray(g_aPunishList, punish_index, punish_info);
    new userid[16]; num_to_str(get_user_userid(id), userid, charsmax(userid));
  
    replace(punish_info[_PunishCmd], charsmax(punish_info[_PunishCmd]), "%userid%", userid);
    replace(punish_info[_PunishCmd], charsmax(punish_info[_PunishCmd]), "%reason%", reason);
  
    server_cmd("%s", punish_info[_PunishCmd]);
}

log_player(id, message[], any:...)
{
    new buffer[256]; vformat(buffer, charsmax(buffer), message, 3);
    new name[32]; get_user_name(id, name, charsmax(name));
    log_to_file(g_szLogFile, "[ACC] %s. Player: ^"%s^"<%s><%s>", buffer, name, player_authid[id], player_ip[id]);
}

generate_string(str[], len)
{
    for(new i; i < len; i++) {
        switch(random(2)) {
            case 0: str[i] = random_num('A', 'Z');
            case 1: str[i] = random_num('a', 'z');
        }
    }
    str[len] = 0;
}
get_punish_index(level)
{
    new size = ArraySize(g_aPunishList);
    for(new i, punish_info[PunishStruct]; i < size; i++) {
        ArrayGetArray(g_aPunishList, i, punish_info);
        if(level == punish_info[_PunishLevel]) {
            return i;
        }
    }
    return INVALID_INDEX;
}

stock send_director_cmd(id , text[])
{
    message_begin( MSG_ONE, SVC_DIRECTOR, _, id );
    write_byte( strlen(text) + 2 );
    write_byte( 10 );
    write_string( text );
    message_end();
}

stock bool:is_user_steam(id)
{
    static dp_pointer;
    if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider"))) {
        server_cmd("dp_clientinfo %d", id); server_exec();
        return (get_pcvar_num(dp_pointer) == 2) ? true : false;
    }
    return false;
}
 
Сообщения
241
Реакции
224
Помог
2 раз(а)
Версия 0.3.7, периодически получаю ошибку из-за неверной индексации. В базе 111 проверок
Код:
L 03/04/2019 - 19:56:00: Start of error session.
L 03/04/2019 - 19:56:00: Info (map "$2000$") (file "addons/amxmodx/logs/error_20190304.log")
L 03/04/2019 - 19:56:00: Invalid index 111 (count: 111)
L 03/04/2019 - 19:56:00: [AMXX] Displaying debug trace (plugin "cmdchecker.amxx", version "0.3.7")
L 03/04/2019 - 19:56:00: [AMXX] Run time error 10: native error (native "ArrayGetArray")
L 03/04/2019 - 19:56:00: [AMXX]    [0] cmdchecker.sma::send_next_cmd (line 482)
Код:
public send_next_cmd(id)
{
    new cmd_info[CommandStruct]; ArrayGetArray(g_aCmdList, current_cmd_state[id], cmd_info);
    copy(current_cmd[id], charsmax(current_cmd[]), cmd_info[_Cmd]);
   
    if(is_player_steam[id])
        send_director_cmd(id, current_cmd[id]);
    else
        client_cmd(id, "%s", current_cmd[id]);
   
    client_cmd(id, "%s", rnd_str[id]);
}
 
Сообщения
332
Реакции
75
Предупреждения
9
Помог
1 раз(а)
Позавчера забанило около 20 стим игроков за 6 часов игры.
Причина 1: +antirclbind
Причина 2: eh_set_aimbot
Отключил данные проверки.
 
Сообщения
24
Реакции
9
Какая разница между маздановским Алиас Чеккером и этим?
 

d3m37r4

111111
Сообщения
1,420
Реакции
1,162
Помог
10 раз(а)
Сообщения
141
Реакции
201
Помог
5 раз(а)
советую всем отключить функцию COMMAND_LOGGER, ибо шансы взломать сервер равны 100%
 
Сообщения
256
Реакции
12
Can someone please upload latest bases.. Thanks
30 Май 2019
Can we use this to block anykind of alias from client?
 

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу