Anti steamid changer и куча игроков играющих семьями

Сообщения
453
Реакции
256
Помог
9 раз(а)
Доброго времени суток, имеется плагин (код ниже), работает хорошо, ложных банов нет (казалось бы), НО - есть люди которые играют с одного айпи и разных компьютеров (брат, сват , жена , сестра) - за день в бан улетело 6 таких игроков (из тех кто обратился к администрации с таковой проблемой после бана).

Лучшее что я смог придумать - вайтлист, но сколько игроков пойдут обращаться к администрации, а сколько забьют и пойдут играть на другой сервер? Пока-что не могу придумать лучшего решения чем отключить плагин, если у кого есть решение, идея - буду признателен.

Есть идея - если на сервере одновременно несколько игроков с одного айпи, сувать их в белый список, но если один вышел, а другой зашёл (с другого ПК) , то тут возникает проблема - улетит в бан.

Код:
#include <amxmodx>
#include <amxmisc>
#include <reapi>

new const WHITE_LIST_FILE[] = "settings/settings_asc_whitelist.ini";

enum client_info_struct {
    CLIENT_IP[MAX_IP_LENGTH],
    CLIENT_STEAMID[MAX_AUTHID_LENGTH]
};

new Array: g_aClientsInfo;
new g_iClients;

new Array: g_aWhiteList;
new g_iWhiteList;

new Array: g_aPunishCache;
new g_iPunishCache;

new g_iReasonCvar;
new g_szReason[47];

new g_iCommandCvar;
new g_szPunishmentCommand[32];

new g_iAddWhiteFlagCvar;
new g_iAddWhiteFlag;

new g_szCfg[MAX_RESOURCE_PATH_LENGTH];

public plugin_init()    {
    register_plugin("Anti steamid changer", "1.0.1", "m4ts");

    load_white_list();

    g_iReasonCvar = create_cvar(
        "asc_reason",
        "Подмена SteamID (Правило 1.02)",
        _,
        "Причина для бана игрока при выявлении подмены стимайди"
    );

    g_iCommandCvar = create_cvar(
        "asc_command",
        "fb_ban 44640 #userid#",
        _,
        "Команда для исполнения наказания"
    );

    g_iAddWhiteFlagCvar = create_cvar(
        "asc_flags",
        "l",
        _,
        "Флаг для доступа к команде asc_add_white (добавление IP в белый список)"
    );

    AutoExecConfig(true, "anti_steamid_change", "punishments");

    RegisterHookChain(RH_Cvar_DirectSet, "RH_Cvar_DirectSet_Post", 1);
}

public RH_Cvar_DirectSet_Post(pcvar, const value[]) {
    if (pcvar == g_iReasonCvar) {
        copy(g_szReason, charsmax(g_szReason), value);
    }
    else if (pcvar == g_iCommandCvar)    {
        copy(g_szPunishmentCommand, charsmax(g_szPunishmentCommand), value);
    }
    else if (pcvar == g_iAddWhiteFlagCvar)    {
        g_iAddWhiteFlag = read_flags(value);

        register_concmd("asc_clear_cache", "concmd_clear_cache", g_iAddWhiteFlag, _, 1);
        register_concmd("asc_add_white", "concmd_add_white", g_iAddWhiteFlag, "<name|steamid|userid>", 1);
    }
}

public concmd_clear_cache(id, level)   {
    if (!access(id, level)) {
        server_print("[ASC] No have access to that command");

        return PLUGIN_HANDLED;
    }

    new destroy = ArrayDestroy(g_aPunishCache);

    server_print("[ASC] %s punishments cache. Total [%d]", destroy ? "Succesfully cleared" : "No had a", g_iPunishCache);

    g_iPunishCache = 0;

    return PLUGIN_HANDLED;
}

public concmd_add_white(id, level)  {
    if (!access(id, level)) {
        server_print("[ASC] No have access to that command");

        return PLUGIN_HANDLED;
    }

    new szArg[MAX_AUTHID_LENGTH];
    read_argv(1, szArg, MAX_AUTHID_LENGTH - 1);

    new player = cmd_target(id, szArg, CMDTARGET_NO_BOTS);

    if (!player)    {
        server_print("[ASC] No players find yet");

        return PLUGIN_HANDLED;
    }

    new szIp[MAX_IP_LENGTH];
    get_user_ip(player, szIp, MAX_IP_LENGTH - 1, 1);

    if (g_iWhiteList && ArrayFindString(g_aWhiteList, szIp) != -1)  {
        server_print("[ASC] This player already have immunity");

        return PLUGIN_HANDLED;
    }

    new file, buffer[64];

    formatex(buffer, charsmax(buffer), "%s    ; %n", szIp, player);

    if (!file_exists(g_szCfg))    {
        file = fopen(g_szCfg, "wt");

        if (!file)  {
            server_print("[ASC] White list file read error");

            return PLUGIN_HANDLED;
        }

        new bSuccess = fputs(file, buffer);
        server_print("[ASC] Player %n (%s) %s added to white list", player, szIp, bSuccess ? "successfully" : "failure");

        if (!g_aWhiteList)  {
            g_aWhiteList = ArrayCreate(MAX_IP_LENGTH + 1, 1);
        }

        ArrayPushString(g_aWhiteList, szIp);

        fclose(file);

        return PLUGIN_HANDLED;
    }

    file = fopen(g_szCfg, "at");

    if (!file)  {
        server_print("[ASC] White list file read error");

        return PLUGIN_HANDLED;
    }

    new bSuccess = fputs(file, buffer);
    server_print("[ASC] Player %n (%s) %s added to white list", player, szIp, bSuccess ? "successfully" : "failure");

    if (!g_aWhiteList)  {
        g_aWhiteList = ArrayCreate(MAX_IP_LENGTH + 1, 1);
    }

    ArrayPushString(g_aWhiteList, szIp);

    fclose(file);

    return PLUGIN_HANDLED;
}

public client_putinserver(id)   {
    new szIp[MAX_IP_LENGTH];
    get_user_ip(id, szIp, MAX_IP_LENGTH - 1, 1);

    if (g_iPunishCache) {
        if (ArrayFindString(g_aPunishCache, szIp) != -1)    {
            server_cmd("kick #%d %s", get_user_userid(id), g_szReason);

            return;
        }
    }

    if (g_iClients && !is_user_hltv(id)) {
        new szOutput[client_info_struct], bool: bGotcha, iItemId;

        for (new i; i < g_iClients; i++)    {
            ArrayGetArray(g_aClientsInfo, i, szOutput, sizeof szOutput);

            if (equal(szOutput[CLIENT_IP], szIp))   {
                bGotcha = true;
                iItemId = i;

                break;
            }
        }

        if (bGotcha)    {
            new szAuthid[MAX_AUTHID_LENGTH];
            get_user_authid(id, szAuthid, MAX_AUTHID_LENGTH - 1);

            if (!equal(szAuthid, szOutput[CLIENT_STEAMID])) {
                client_punishment(id);

                ArrayDeleteItem(g_aClientsInfo, iItemId);
                g_iClients--;

                if (!g_aPunishCache)    {
                    g_aPunishCache = ArrayCreate(MAX_IP_LENGTH + 1, 1);
                }

                ArrayPushString(g_aPunishCache, szIp);
                g_iPunishCache++;
            }
        }
    }
}

public client_disconnected(id)  {
    if (!g_aClientsInfo)    {
        g_aClientsInfo = ArrayCreate(client_info_struct);
    }

    new szInput[client_info_struct];

    get_user_ip(id, szInput[CLIENT_IP], MAX_IP_LENGTH - 1, 1);
    get_user_authid(id, szInput[CLIENT_STEAMID], MAX_AUTHID_LENGTH - 1);

    if (g_iWhiteList)   {
        if (ArrayFindString(g_aWhiteList, szInput[CLIENT_IP]) != -1)    {
            return;
        }
    }

    ArrayPushArray(g_aClientsInfo, szInput);
    g_iClients++;
}

stock client_punishment(id)    {
    new szIp[MAX_IP_LENGTH];
    get_user_ip(id, szIp, MAX_IP_LENGTH - 1, 1);

    replace_string(g_szPunishmentCommand, charsmax(g_szPunishmentCommand), "#userid#", fmt("#%d", get_user_userid(id)), false);
    replace_string(g_szPunishmentCommand, charsmax(g_szPunishmentCommand), "#ip#", szIp, false);

    server_cmd("%s %s; writeip; writeid", g_szPunishmentCommand, g_szReason);
    server_exec();
}

stock load_white_list() {
    get_configsdir(g_szCfg, MAX_RESOURCE_PATH_LENGTH - 1);
    add(g_szCfg, charsmax(g_szCfg), fmt("/%s", WHITE_LIST_FILE));

    if (!file_exists(g_szCfg))    {
        log_error(AMX_ERR_NATIVE, "File %s is not exists", g_szCfg);

        return;
    }

    new file = fopen(g_szCfg, "rt");

    if (!file)  {
        log_error(AMX_ERR_NATIVE, "File %s open error", g_szCfg);

        return;
    }

    g_aWhiteList = ArrayCreate(MAX_IP_LENGTH + 1, 1);

    new buffer[64], szIp[MAX_IP_LENGTH];

    while (!feof(file)) {
        fgets(file, buffer, charsmax(buffer));

        if (buffer[0] == EOS || buffer[0] == ';')   {
            continue;
        }

        delete_comment(buffer);
        trim(buffer);

        parse(buffer, szIp, charsmax(szIp));

        g_iWhiteList++;
        ArrayPushString(g_aWhiteList, szIp);
    }

    log_amx("Successfully loaded whitelist, count : %d", g_iWhiteList);

    fclose(file);
}

new const COMMENTS[] =   {
    '#', ';'
};

new const QUOTE = '^"';

stock delete_comment(szString[])    {
    new len = strlen(szString);
    new bool: bInQuotes;

    for (new i; i < len; i++)   {
        if (szString[i] == QUOTE)    {
            bInQuotes = !bInQuotes;
        }

        if (bInQuotes)  {
            continue;
        }

        for (new c; c < sizeof COMMENTS; c++)   {
            if (szString[i] == COMMENTS[c]) {
                szString[i] = EOS;

                break;
            }
        }
    }
}
 
Сообщения
219
Реакции
42
Why is the reason to have this plugin on?

Use reunion SteamidHashSalt function.
They will never can change his steamid.

Also, if I play on a computer and get banned. Then, my brother connects with same ip on different computer with different steamid will get punished too.
That plugin is a bad idea.
 
Сообщения
78
Реакции
65
raulitop, how hashing will prevent steamid change? I dont understand, can you explain please?
 
Сообщения
453
Реакции
256
Помог
9 раз(а)
raulitop,
Also, if I play on a computer and get banned. Then, my brother connects with same ip on different computer with different steamid will get punished too.
That plugin is a bad idea
В посте про это описано.


Steamid changer is a cheat software to steal steamids.
Не обязательно, обычно используется для обхода бана в связке со сменой айпи

соль используется, от ченджеров не спасает
 
Сообщения
453
Реакции
256
Помог
9 раз(а)
Up
За чеканную тоже рассматриваем
 

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

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