• Пожалуйста, создайте название темы отражающее ее смысл
  • Для ускорения решения Вашего вопроса заполните обязательные поля и подробно опишите возникшую проблему

Помощь Помощь по плагину VoteBan Menu 1.1

AkycTuk

Участник
Источник плагина (исходный код)
C++:
#include <amxmodx>



new szPluginInfo[][] = { "VoteBan Menu", "1.1" };



// Для поддержки создания услуги: Иммунитет от VoteBan'a

// NOTE: Требуется плагин GameCms API

// Закомментируйте для отключения поддержки GameCMS API

#define SUPPORT_CMS



// Название файла для записи логов

// NOTE: расширение ".log" Обязательно!

#define LogFile_Name "VoteBan_Menu.log"



// Стандартные причины VoteBan.

// Максимальное кол-во 8 (Иначе сломается меню)

// Пункт "Своя причина" добавляется в конце списка.

new g_aBanReasons[][64] = {

    "Читер",

    "Флуд в Микро",

    "Мешает играть",

    "Оскорбляет игроков",

    "Неадекватное поведение"

};



#if defined SUPPORT_CMS

#include <gamecms5>

#endif



new g_iReasonsMenu;

new g_iVoteMenu;

new _access, callback, ItemData[3];

new g_iInsider;

new g_iVoteStartTime;

new g_iVoteCount, bool:g_bIsVoted[33];

new g_iVictim;

new g_sBanReason[128];

new g_iVoteBanPlayersNum, g_iVoteBanPlayers[33];



enum E_Cvars {

    C_Access_VTB,

    C_AccessFlags[16],

    C_ChatPrefix[16],

    C_MinPlayers,

Float:C_BanRatio,

    C_TimeBetween,

Float:C_DurationVote,

    C_BanTime,

    C_BanType,

    C_FlagsImmunity[16],

    C_AdminFlags[16],

#if defined SUPPORT_CMS

    C_ServiceName[32],

#endif

}

new Cvars[E_Cvars];



public plugin_init() {

    register_clcmd("voteban",            "CmdVoteban");

    register_clcmd("say /voteban",         "CmdVoteban");

    register_clcmd("say_team /voteban",    "CmdVoteban");

    register_clcmd("say /vtb",            "CmdVoteban");

    register_clcmd("say_team /vtb",        "CmdVoteban");



    register_clcmd("vtb_reason",         "ClCmdReason");

    register_srvcmd("voteban_lockmap",    "Check_LockMap");



    register_dictionary("VoteBan_Menu.txt");

}



public plugin_precache() {

    register_plugin(szPluginInfo[0], szPluginInfo[1], "Author + ApXuTekToR" );

    InitCvars();

}



public plugin_cfg() {

#if defined SUPPORT_CMS

    if(is_plugin_loaded("GameCMS_API") == INVALID_PLUGIN_ID) {

        log_amx("WARNING: GameCMS API isn't loaded! Plugin Stopped.");

        pause("a");

        return;

    }

#endif

    create_menu();

}



create_menu() {

    g_iReasonsMenu     = menu_create("\d[\rVoteBan\d] \yВыберите причину бана\w", "ReasonsMenuHandler");

    g_iVoteMenu     = menu_create("UNNAMED_MENU", "VoteMenuHandler");



    menu_setprop(g_iReasonsMenu,     MPROP_EXIT, MEXIT_NEVER);

    menu_setprop(g_iReasonsMenu,     MPROP_PERPAGE, 0);

    menu_setprop(g_iVoteMenu,         MPROP_EXIT, MEXIT_NEVER);



    new num[3];

    for(new i; i < sizeof g_aBanReasons; i++) {

        num_to_str(i, num, charsmax(num));

        menu_additem(g_iReasonsMenu, g_aBanReasons, num);

    }

    menu_addblank(g_iReasonsMenu, 0);

    menu_additem(g_iReasonsMenu, "\yСвоя причина", "69");

 

    menu_additem(g_iVoteMenu, "\rДа", "1");

    menu_additem(g_iVoteMenu, "\yНет", "0");

}



InitCvars() {

    bind_pcvar_string(create_cvar(    "VoteBan_ChatPrefix",        "VB",    FCVAR_NONE, "Префикс для чат сообщений"                                        ), Cvars[C_ChatPrefix],        charsmax(Cvars[C_ChatPrefix]));

    bind_pcvar_num(create_cvar(        "VoteBan_MinPlayers",        "5",    FCVAR_NONE, "Минимальное кол-во игроков на сервере для запуска голосования"    ), Cvars[C_MinPlayers]);

    bind_pcvar_float(create_cvar(    "VoteBan_BanRatio",            "0.8",    FCVAR_NONE, "Коэффицент голосов для бана.^n\

                                                                                    '0.1' - 10% | '1.0' - 100%"                                        ), Cvars[C_BanRatio]);

    bind_pcvar_num(create_cvar(        "VoteBan_TimeBetween",        "5",    FCVAR_NONE, "Время между голосованиями (в секундах)"                        ), Cvars[C_TimeBetween]);

    bind_pcvar_float(create_cvar(    "VoteBan_DurationVote",        "15.0",    FCVAR_NONE, "Продолжительность голосования"                                    ), Cvars[C_DurationVote]);

    bind_pcvar_num(create_cvar(        "VoteBan_BanType",            "1",    FCVAR_NONE, "Тип наказания:^n\

                                                                                    '0' - кик^n\

                                                                                    '1' - AmxBans/FreshBans^n\

                                                                                    '2' - Lite Bans (Neugomon)"                                        ), Cvars[C_BanType]);

    bind_pcvar_num(create_cvar(        "VoteBan_BanTime",            "1440",    FCVAR_NONE, "Время бана (в минутах)"                                        ), Cvars[C_BanTime]);



    bind_pcvar_num(create_cvar(        "VoteBan_Access_VTB",        "0",    FCVAR_NONE, "Кому доступно право на голосование?^n\

                                                                                    '0' - Доступно всем^n\

                                                                                    '1' - По флагу доступа"                                            ), Cvars[C_Access_VTB]);

    bind_pcvar_string(create_cvar(    "VoteBan_AccessFlags",        "t",    FCVAR_NONE, "Флаг доступа к вотебану"                                        ), Cvars[C_AccessFlags],    charsmax(Cvars[C_AccessFlags]));



    bind_pcvar_string(create_cvar(    "VoteBan_FlagsImmunity",    "a",    FCVAR_NONE, "Флаг иммунитета от бана"                                        ), Cvars[C_FlagsImmunity],    charsmax(Cvars[C_FlagsImmunity]));

#if defined SUPPORT_CMS

    bind_pcvar_string(create_cvar(    "VoteBan_ServiceImmunity",    "_vtb_immunity",    FCVAR_PROTECTED, "Название услуги для иммунитета от вотебана"    ), Cvars[C_ServiceName],    charsmax(Cvars[C_ServiceName]));

#endif

    bind_pcvar_string(create_cvar(    "VoteBan_AdminFlags",        "d",    FCVAR_PROTECTED, "Флаг Администратора^n\

                                                                                    Note: Если игрок с данным флагом на сервере - голосование недоступно"    ), Cvars[C_AdminFlags],    charsmax(Cvars[C_AdminFlags]));



    AutoExecConfig(true, "Voteban_Menu", "SevCorp");

}



#if defined SUPPORT_BLOCK

public block_plug() {

    new bool:IsAccess = false;

    new szServerIP[22]; get_user_ip(0, szServerIP, charsmax(szServerIP));

    for(new i; i < sizeof(PluginIP); i++) {

        if(equal(PluginIP, szServerIP))

            IsAccess = true;

    }

    if(!IsAccess) {

        //server_print("[ %s v%s ] Нужна лицензия? - Купи тут: https://epic-cs.ru/forums", szPluginInfo[0], szPluginInfo[1]);

        //set_fail_state("[ %s v%s ] Вот ты и папался дружок! Нет лицензии - иди гуляй!", szPluginInfo[0], szPluginInfo[1]);

    }

}

#endif



public client_disconnected(id) {

    if(g_bIsVoted[id]) {

        g_bIsVoted[id] = false;

        g_iVoteCount--;

    }

}



public CmdVoteban(id) {

    if(Cvars[C_Access_VTB] == 1) {

        if(CheckAccess(id, Cvars[C_AccessFlags])) {

            ClCmdVoteban(id);

        } else {

            client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]);

            return PLUGIN_HANDLED;

        }

    } else if(Cvars[C_Access_VTB] == 0) {

        ClCmdVoteban(id);

    }

    return PLUGIN_HANDLED;

}



public ClCmdVoteban(id) {

    static players[32], pnum, iVtbDelay;

    if(g_iInsider)

        return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ALREADY_RUNNING", Cvars[C_ChatPrefix]);

    if((iVtbDelay = g_iVoteStartTime + Cvars[C_TimeBetween] - get_systime()) > 0)

        return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_AVAILABLE_VIA_TIME", Cvars[C_ChatPrefix], (iVtbDelay / 60), (iVtbDelay % 60));

    get_players(players, pnum);

    if(Cvars[C_MinPlayers] > pnum)

        return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_MIN_PLAYERS", Cvars[C_ChatPrefix], Cvars[C_MinPlayers]);



    g_iVoteBanPlayersNum = 0;

    for(new i; i < pnum; i++) {

        if(CheckAccess(players, Cvars[C_AdminFlags]))

            return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ADMIN_CHECK", Cvars[C_ChatPrefix]);

        g_iVoteBanPlayers[g_iVoteBanPlayersNum++] = players;

    }

    return SelectPlayerOnBan(id);

}



public SelectPlayerOnBan(id) {

    new iPlayersMenu = menu_create("\d[\rVoteBan\d] \yВыберите игрока\w", "PlayersMenuHandler");

    new iCallBack      = menu_makecallback("PlayersMenuCallback");

    menu_setprop(iPlayersMenu, MPROP_BACKNAME, "Назад");

    menu_setprop(iPlayersMenu, MPROP_NEXTNAME, "Далее");

    menu_setprop(iPlayersMenu, MPROP_EXITNAME, "Выход");



    new name[32], num[3];

    for(new i; i < g_iVoteBanPlayersNum; i++) {

        if(g_iVoteBanPlayers == id)

            continue;

        get_user_name(g_iVoteBanPlayers, name, charsmax(name));

        num_to_str(g_iVoteBanPlayers, num, charsmax(num));

        menu_additem(iPlayersMenu, name, num, 0, iCallBack);

    }

    menu_display(id, iPlayersMenu, 0);

    return PLUGIN_HANDLED;

}



public PlayersMenuCallback(id, menu, item) {

    static ItemName[32], ItemNewName[64];

    menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), ItemName, charsmax(ItemName), callback);

#if defined SUPPORT_CMS

    static Array:Services;

    Services = cmsapi_get_user_services(str_to_num(ItemData), "", Cvars[C_ServiceName]);

    if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]) || Services)

#else

    if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]))

#endif

    {

        formatex(ItemNewName, charsmax(ItemNewName), "\d%s \y[\rИммунитет\y]", ItemName);

        menu_item_setname(menu, item, ItemNewName);

        return ITEM_DISABLED;

    }

    return ITEM_ENABLED;

}



public PlayersMenuHandler(id, menu, item) {

    if(item == MENU_EXIT) {

        menu_destroy(menu);

        return PLUGIN_HANDLED;

    }

    menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);

    g_iVictim = str_to_num(ItemData);

    menu_destroy(menu);

    return menu_display(id, g_iReasonsMenu);

}



public ReasonsMenuHandler(id, menu, item) {

    menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);

    new ReasonId = str_to_num(ItemData);

    if(ReasonId == 69) {

        client_cmd(id, "messagemode vtb_reason");

    } else {

        g_sBanReason = g_aBanReasons[ReasonId];

        VoteBanAction(id);

    }

    return PLUGIN_HANDLED;

}



public ClCmdReason(id) {

    if(Cvars[C_Access_VTB] == 1) {

        if(CheckAccess(id, Cvars[C_AccessFlags])) {

            client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]);

            return PLUGIN_HANDLED;

        }

    }

    static sReason[64];

    read_args(sReason, charsmax(sReason));

    remove_quotes(sReason);

    g_sBanReason = sReason[0] ? sReason : "unknown";

    return VoteBanAction(id);

}



VoteBanAction(id) {

    static sInsName[32], sVicName[32], sTitle[256];

    get_user_name(id, sInsName, charsmax(sInsName));

    get_user_name(g_iVictim, sVicName, charsmax(sVicName));

    formatex(sTitle, charsmax(sTitle), "\rЗабанить \y%s\w?^n\rПричина\w: \y%s^n\dЗапустил \r%s", sVicName, g_sBanReason, sInsName);

    menu_setprop(g_iVoteMenu, MPROP_TITLE, sTitle);



    g_iInsider              = id;

    g_iVoteStartTime     = get_systime();

    g_iVoteCount          = 0;

    arrayset(g_bIsVoted, false, sizeof(g_bIsVoted));



    for(new i; i < g_iVoteBanPlayersNum; ++i) {

        if(g_iVoteBanPlayers != g_iVictim)

            menu_display(g_iVoteBanPlayers, g_iVoteMenu);

    }

    return set_task(Cvars[C_DurationVote], "VoteBanResults");

}



public VoteMenuHandler(id, menu, item) {

    if(item != MENU_EXIT) {

        menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);

        if(str_to_num(ItemData)) {

            g_iVoteCount++;

            g_bIsVoted[id] = true;

        }

    }

    return PLUGIN_HANDLED;

}



public VoteBanResults() {

    show_menu(0, 0, "^n", 1); // визуально закрываем меню.

    if(is_user_connected(g_iVictim)) {

        new iVoteBanMinVotes = floatround(Cvars[C_BanRatio] * float(g_iVoteBanPlayersNum));

        new name[32]; get_user_name(g_iVictim, name, charsmax(name));

        if(g_iVoteCount >= iVoteBanMinVotes) {

            if(Cvars[C_BanType] == 0) server_cmd("kick #%d ^"%s^"", get_user_userid(g_iVictim), g_sBanReason);

            else if(Cvars[C_BanType] == 1) server_cmd("amx_ban %d #%d ^"%s^"", Cvars[C_BanTime], get_user_userid(g_iVictim), g_sBanReason);

            else if(Cvars[C_BanType] == 2) server_cmd("amx_ban #%d %d ^"%s^"", get_user_userid(g_iVictim), Cvars[C_BanTime], g_sBanReason);



            client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_1", Cvars[C_ChatPrefix]);

            client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes);

            log_to_file(LogFile_Name, "VOTEBAN SUCCESS: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name,  g_sBanReason, g_iVoteCount, iVoteBanMinVotes);

        } else {

            client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_1", Cvars[C_ChatPrefix]);

            client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes);

            log_to_file(LogFile_Name, "VOTEBAN FAILED: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name,  g_sBanReason, g_iVoteCount, iVoteBanMinVotes);

        }

    } else client_print_color(g_iInsider, print_team_default, "%L", LANG_PLAYER, "LANG_PLAYER_IS_OUT", Cvars[C_ChatPrefix]);

    g_iInsider = g_iVictim = 0;

}



public Check_LockMap() {

    new getmap[32], map[32];

    read_args(getmap, charsmax(getmap));

    remove_quotes(getmap);

    get_mapname(map, charsmax(map));

    if(!strcmp(getmap, map, true))

        pause("ad");

}



CheckAccess(const Id, const Flags[]) {

    static FlagsBits; FlagsBits = read_flags(Flags);

    return (get_user_flags(Id) & FlagsBits || !FlagsBits);

}
Общий лог АМХ (amxmodx/logs/Lxxxxxxx.log)
-
Лог ошибок АМХ (amxmodx/logs/error_xxxxxxx.log)
L 10/02/2020 - 21:50:36: Start of error session.
L 10/02/2020 - 21:50:36: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20201002.log")
L 10/02/2020 - 21:50:36: [AMXX] Displaying debug trace (plugin "VoteBan_Menu.amxx", version "1.1")
L 10/02/2020 - 21:50:36: [AMXX] Run time error 4: index out of bounds
L 10/02/2020 - 21:50:36: [AMXX] [0] VoteBan_Menu.sma::ReasonsMenuHandler (line 243)
Список плагинов (amx_plugins)
-
Список модулей (meta list)
-
Ссылка на плагин

В данном плагине иногда появляется ошибка вида:

L 03/15/2020 - 16:33:46: Player 24 is not in game.
L 03/15/2020 - 16:33:46: [AMXX] Run time error 10 (plugin "VoteBan_Menu.amxx") (native "menu_display") - debug not enabled!
L 03/15/2020 - 16:33:46: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).

Как понимаю ошибка возникает, когда игрок успевает выйти во время голосования.

L 10/02/2020 - 21:50:36: Start of error session.
L 10/02/2020 - 21:50:36: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20201002.log")
L 10/02/2020 - 21:50:36: [AMXX] Displaying debug trace (plugin "VoteBan_Menu.amxx", version "1.1")
L 10/02/2020 - 21:50:36: [AMXX] Run time error 4: index out of bounds
L 10/02/2020 - 21:50:36: [AMXX] [0] VoteBan_Menu.sma::ReasonsMenuHandler (line 243)

Нашёл решение в интернете, заменить:

C++:
for(new i; i < g_iVoteBanPlayersNum; ++i)

    {

        if(g_iVoteBanPlayers[i] != g_iVictim)

            menu_display(g_iVoteBanPlayers[i], g_iVoteMenu);

    }[
на

C++:
new pPlayers[MAX_PLAYERS], iPlCount

    get_players(pPlayers, iPlCount, "ch")



    for(new i; i < iPlCount; i++) {

        if(pPlayers[i] != g_iVictim)

            menu_display(pPlayers[i], g_iVoteMenu);

    }
Но тогда плагин компилируется с варнингами:
Код:
1. AMX Mod X 1.9.0 5271 (Reapi 5.11.0.197)\VoteBan_Menu.sma(275) : warning 217: loose indentation
2. AMX Mod X 1.9.0 5271 (Reapi 5.11.0.197)\VoteBan_Menu.sma(281) : warning 217: loose indentation
3. AMX Mod X 1.9.0 5271 (Reapi 5.11.0.197)\include\gamecms5.inc(109) : error 001: expected token: ";", but found "enum"
Добавил ";" в инклуд, осталось понять, чем ему не нравятся отступы пунктов 1 и 2?

C++:
#include <amxmodx>

#pragma semicolon 1

new szPluginInfo[][] = { "VoteBan Menu", "1.1" };



// Для поддержки создания услуги: Иммунитет от VoteBan'a

// NOTE: Требуется плагин GameCms API

// Закомментируйте для отключения поддержки GameCMS API

#define SUPPORT_CMS



// Название файла для записи логов

// NOTE: расширение ".log" Обязательно!

#define LogFile_Name "VoteBan_Menu.log"



// Стандартные причины VoteBan.

// Максимальное кол-во 8 (Иначе сломается меню)

// Пункт "Своя причина" добавляется в конце списка.

new g_aBanReasons[][64] = {

    "Читер",

    "Флуд в Микро",

    "Мешает играть",

    "Оскорбляет игроков",

    "Неадекватное поведение"

};



#if defined SUPPORT_CMS

#include <gamecms5>

#endif



new g_iReasonsMenu;

new g_iVoteMenu;

new _access, callback, ItemData[3];

new g_iInsider;

new g_iVoteStartTime;

new g_iVoteCount, bool:g_bIsVoted[33];

new g_iVictim;

new g_sBanReason[128];

new g_iVoteBanPlayersNum, g_iVoteBanPlayers[33];



enum E_Cvars {

    C_Access_VTB,

    C_AccessFlags[16],

    C_ChatPrefix[16],

    C_MinPlayers,

Float:C_BanRatio,

    C_TimeBetween,

Float:C_DurationVote,

    C_BanTime,

    C_BanType,

    C_FlagsImmunity[16],

    C_AdminFlags[16],

#if defined SUPPORT_CMS

    C_ServiceName[32],

#endif

}

new Cvars[E_Cvars];



public plugin_init() {

    register_clcmd("voteban",            "CmdVoteban");

    register_clcmd("say /voteban",         "CmdVoteban");

    register_clcmd("say_team /voteban",    "CmdVoteban");

    register_clcmd("say /vtb",            "CmdVoteban");

    register_clcmd("say_team /vtb",        "CmdVoteban");



    register_clcmd("vtb_reason",         "ClCmdReason");

    register_srvcmd("voteban_lockmap",    "Check_LockMap");



    register_dictionary("VoteBan_Menu.txt");

}



public plugin_precache() {

    register_plugin(szPluginInfo[0], szPluginInfo[1], "Author + ApXuTekToR" );

    InitCvars();

}



public plugin_cfg() {

#if defined SUPPORT_CMS

    if(is_plugin_loaded("GameCMS_API") == INVALID_PLUGIN_ID) {

        log_amx("WARNING: GameCMS API isn't loaded! Plugin Stopped.");

        pause("a");

        return;

    }

#endif

    create_menu();

}



create_menu() {

    g_iReasonsMenu     = menu_create("\d[\rVoteBan\d] \yВыберите причину бана\w", "ReasonsMenuHandler");

    g_iVoteMenu     = menu_create("UNNAMED_MENU", "VoteMenuHandler");



    menu_setprop(g_iReasonsMenu,     MPROP_EXIT, MEXIT_NEVER);

    menu_setprop(g_iReasonsMenu,     MPROP_PERPAGE, 0);

    menu_setprop(g_iVoteMenu,         MPROP_EXIT, MEXIT_NEVER);



    new num[3];

    for(new i; i < sizeof g_aBanReasons; i++) {

        num_to_str(i, num, charsmax(num));

        menu_additem(g_iReasonsMenu, g_aBanReasons[i], num);

    }

    menu_addblank(g_iReasonsMenu, 0);

    menu_additem(g_iReasonsMenu, "\yСвоя причина", "69");



    menu_additem(g_iVoteMenu, "\rДа", "1");

    menu_additem(g_iVoteMenu, "\yНет", "0");

}



InitCvars() {

    bind_pcvar_string(create_cvar(    "VoteBan_ChatPrefix",        "VB",    FCVAR_NONE, "Префикс для чат сообщений"                                        ), Cvars[C_ChatPrefix],        charsmax(Cvars[C_ChatPrefix]));

    bind_pcvar_num(create_cvar(        "VoteBan_MinPlayers",        "5",    FCVAR_NONE, "Минимальное кол-во игроков на сервере для запуска голосования"    ), Cvars[C_MinPlayers]);

    bind_pcvar_float(create_cvar(    "VoteBan_BanRatio",            "0.8",    FCVAR_NONE, "Коэффицент голосов для бана.^n\ '0.1' - 10% | '1.0' - 100%"    ), Cvars[C_BanRatio]);               

    bind_pcvar_num(create_cvar(        "VoteBan_TimeBetween",        "5",    FCVAR_NONE, "Время между голосованиями (в секундах)"                        ), Cvars[C_TimeBetween]);

    bind_pcvar_float(create_cvar(    "VoteBan_DurationVote",        "15.0",    FCVAR_NONE, "Продолжительность голосования"                                    ), Cvars[C_DurationVote]);

    bind_pcvar_num(create_cvar(        "VoteBan_BanType",            "1",    FCVAR_NONE, "Тип наказания:^n\

                                                                                    '0' - кик^n\

                                                                                    '1' - AmxBans/FreshBans^n\

                                                                                    '2' - Lite Bans (Neugomon)"                                        ), Cvars[C_BanType]);

    bind_pcvar_num(create_cvar(        "VoteBan_BanTime",            "1440",    FCVAR_NONE, "Время бана (в минутах)"                                        ), Cvars[C_BanTime]);



    bind_pcvar_num(create_cvar(        "VoteBan_Access_VTB",        "0",    FCVAR_NONE, "Кому доступно право на голосование?^n\

                                                                                    '0' - Доступно всем^n\

                                                                                    '1' - По флагу доступа"                                            ), Cvars[C_Access_VTB]);

    bind_pcvar_string(create_cvar(    "VoteBan_AccessFlags",        "t",    FCVAR_NONE, "Флаг доступа к вотебану"                                        ), Cvars[C_AccessFlags],    charsmax(Cvars[C_AccessFlags]));



    bind_pcvar_string(create_cvar(    "VoteBan_FlagsImmunity",    "a",    FCVAR_NONE, "Флаг иммунитета от бана"                                        ), Cvars[C_FlagsImmunity],    charsmax(Cvars[C_FlagsImmunity]));

#if defined SUPPORT_CMS

    bind_pcvar_string(create_cvar(    "VoteBan_ServiceImmunity",    "_vtb_immunity",    FCVAR_PROTECTED, "Название услуги для иммунитета от вотебана"    ), Cvars[C_ServiceName],    charsmax(Cvars[C_ServiceName]));

#endif

    bind_pcvar_string(create_cvar(    "VoteBan_AdminFlags",        "d",    FCVAR_PROTECTED, "Флаг Администратора^n\

                                                                                    Note: Если игрок с данным флагом на сервере - голосование недоступно"    ), Cvars[C_AdminFlags],    charsmax(Cvars[C_AdminFlags]));



    AutoExecConfig(true, "Voteban_Menu", "SevCorp");

}



#if defined SUPPORT_BLOCK

public block_plug() {

    new bool:IsAccess = false;

    new szServerIP[22]; get_user_ip(0, szServerIP, charsmax(szServerIP));

    for(new i; i < sizeof(PluginIP); i++) {

        if(equal(PluginIP[i], szServerIP))

            IsAccess = true;

    }

    if(!IsAccess) {

        //server_print("[ %s v%s ] Нужна лицензия? - Купи тут: https://epic-cs.ru/forums", szPluginInfo[0], szPluginInfo[1]);

        //set_fail_state("[ %s v%s ] Вот ты и папался дружок! Нет лицензии - иди гуляй!", szPluginInfo[0], szPluginInfo[1]);

    }

}

#endif



public client_disconnected(id) {

    if(g_bIsVoted[id]) {

        g_bIsVoted[id] = false;

        g_iVoteCount--;

    }

}



public CmdVoteban(id) {

    if(Cvars[C_Access_VTB] == 1) {

        if(CheckAccess(id, Cvars[C_AccessFlags])) {

            ClCmdVoteban(id);

        } else {

            client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]);

            return PLUGIN_HANDLED;

        }

    } else if(Cvars[C_Access_VTB] == 0) {

        ClCmdVoteban(id);

    }

    return PLUGIN_HANDLED;

}



public ClCmdVoteban(id) {

    static players[32], pnum, iVtbDelay;

    if(g_iInsider)

        return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ALREADY_RUNNING", Cvars[C_ChatPrefix]);

    if((iVtbDelay = g_iVoteStartTime + Cvars[C_TimeBetween] - get_systime()) > 0)

        return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_AVAILABLE_VIA_TIME", Cvars[C_ChatPrefix], (iVtbDelay / 60), (iVtbDelay % 60));

    get_players(players, pnum);

    if(Cvars[C_MinPlayers] > pnum)

        return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_MIN_PLAYERS", Cvars[C_ChatPrefix], Cvars[C_MinPlayers]);



    g_iVoteBanPlayersNum = 0;

    for(new i; i < pnum; i++) {

        if(CheckAccess(players[i], Cvars[C_AdminFlags]))

            return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ADMIN_CHECK", Cvars[C_ChatPrefix]);

        g_iVoteBanPlayers[g_iVoteBanPlayersNum++] = players[i];

    }

    return SelectPlayerOnBan(id);

}



public SelectPlayerOnBan(id) {

    new iPlayersMenu = menu_create("\d[\rVoteBan\d] \yВыберите игрока\w", "PlayersMenuHandler");

    new iCallBack      = menu_makecallback("PlayersMenuCallback");

    menu_setprop(iPlayersMenu, MPROP_BACKNAME, "Назад");

    menu_setprop(iPlayersMenu, MPROP_NEXTNAME, "Далее");

    menu_setprop(iPlayersMenu, MPROP_EXITNAME, "Выход");



    new name[32], num[3];

    for(new i; i < g_iVoteBanPlayersNum; i++) {

        if(g_iVoteBanPlayers[i] == id)

            continue;

        get_user_name(g_iVoteBanPlayers[i], name, charsmax(name));

        num_to_str(g_iVoteBanPlayers[i], num, charsmax(num));

        menu_additem(iPlayersMenu, name, num, 0, iCallBack);

    }

    menu_display(id, iPlayersMenu, 0);

    return PLUGIN_HANDLED;

}



public PlayersMenuCallback(id, menu, item) {

    static ItemName[32], ItemNewName[64];

    menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), ItemName, charsmax(ItemName), callback);

#if defined SUPPORT_CMS

    static Array:Services;

    Services = cmsapi_get_user_services(str_to_num(ItemData), "", Cvars[C_ServiceName]);

    if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]) || Services)

#else

    if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]))

#endif

    {

        formatex(ItemNewName, charsmax(ItemNewName), "\d%s \y[\rИммунитет\y]", ItemName);

        menu_item_setname(menu, item, ItemNewName);

        return ITEM_DISABLED;

    }

    return ITEM_ENABLED;

}



public PlayersMenuHandler(id, menu, item) {

    if(item == MENU_EXIT) {

        menu_destroy(menu);

        return PLUGIN_HANDLED;

    }

    menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);

    g_iVictim = str_to_num(ItemData);

    menu_destroy(menu);

    return menu_display(id, g_iReasonsMenu);

}



public ReasonsMenuHandler(id, menu, item) {

    menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);

    new ReasonId = str_to_num(ItemData);

    if(ReasonId == 69) {

        client_cmd(id, "messagemode vtb_reason");

    } else {

        g_sBanReason = g_aBanReasons[ReasonId];

        VoteBanAction(id);

    }

    return PLUGIN_HANDLED;

}



public ClCmdReason(id) {

    if(Cvars[C_Access_VTB] == 1) {

        if(CheckAccess(id, Cvars[C_AccessFlags])) {

            client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]);

            return PLUGIN_HANDLED;

        }

    }

    static sReason[64];

    read_args(sReason, charsmax(sReason));

    remove_quotes(sReason);

    g_sBanReason = sReason[0] ? sReason : "unknown";

    return VoteBanAction(id);

}



VoteBanAction(id) {

    static sInsName[32], sVicName[32], sTitle[256];

    get_user_name(id, sInsName, charsmax(sInsName));

    get_user_name(g_iVictim, sVicName, charsmax(sVicName));

    formatex(sTitle, charsmax(sTitle), "\rЗабанить \y%s\w?^n\rПричина\w: \y%s^n\dЗапустил \r%s", sVicName, g_sBanReason, sInsName);

    menu_setprop(g_iVoteMenu, MPROP_TITLE, sTitle);



    g_iInsider              = id;

    g_iVoteStartTime     = get_systime();

    g_iVoteCount          = 0;

    arrayset(g_bIsVoted, false, sizeof(g_bIsVoted));



    new pPlayers[MAX_PLAYERS], iPlCount;

    get_players(pPlayers, iPlCount, "ch");



    for(new i; i < iPlCount; i++) {

        if(pPlayers[i] != g_iVictim)

            menu_display(pPlayers[i], g_iVoteMenu);

    }

    return set_task(Cvars[C_DurationVote], "VoteBanResults");

}



public VoteMenuHandler(id, menu, item) {

    if(item != MENU_EXIT) {

        menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);

        if(str_to_num(ItemData)) {

            g_iVoteCount++;

            g_bIsVoted[id] = true;

        }

    }

    return PLUGIN_HANDLED;

}



public VoteBanResults() {

    show_menu(0, 0, "^n", 1); // визуально закрываем меню.

    if(is_user_connected(g_iVictim)) {

        new iVoteBanMinVotes = floatround(Cvars[C_BanRatio] * float(g_iVoteBanPlayersNum));

        new name[32]; get_user_name(g_iVictim, name, charsmax(name));

        if(g_iVoteCount >= iVoteBanMinVotes) {

            if(Cvars[C_BanType] == 0) server_cmd("kick #%d ^"%s^"", get_user_userid(g_iVictim), g_sBanReason);

            else if(Cvars[C_BanType] == 1) server_cmd("amx_ban %d #%d ^"%s^"", Cvars[C_BanTime], get_user_userid(g_iVictim), g_sBanReason);

            else if(Cvars[C_BanType] == 2) server_cmd("amx_ban #%d %d ^"%s^"", get_user_userid(g_iVictim), Cvars[C_BanTime], g_sBanReason);



            client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_1", Cvars[C_ChatPrefix]);

            client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes);

            log_to_file(LogFile_Name, "VOTEBAN SUCCESS: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name,  g_sBanReason, g_iVoteCount, iVoteBanMinVotes);

        } else {

            client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_1", Cvars[C_ChatPrefix]);

            client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes);

            log_to_file(LogFile_Name, "VOTEBAN FAILED: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name,  g_sBanReason, g_iVoteCount, iVoteBanMinVotes);

        }

    } else client_print_color(g_iInsider, print_team_default, "%L", LANG_PLAYER, "LANG_PLAYER_IS_OUT", Cvars[C_ChatPrefix]);

    g_iInsider = g_iVictim = 0;

}



public Check_LockMap() {

    new getmap[32], map[32];

    read_args(getmap, charsmax(getmap));

    remove_quotes(getmap);

    get_mapname(map, charsmax(map));

    if(!strcmp(getmap, map, true))

        pause("ad");

}



CheckAccess(const Id, const Flags[]) {

    static FlagsBits; FlagsBits = read_flags(Flags);

    return (get_user_flags(Id) & FlagsBits || !FlagsBits);

}

И собственно, такое решение уберет ошибку "Player 24 is not in game" ?
 
Последнее редактирование:
Сверху