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

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

AkycTuk

Участник
Сообщения
73
Реакции
19
Баллы
8
Ссылка на плагин

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

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" ?
 
Исходный код
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);


}
-
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 10/16/2021 - 01:17:27: Start of error session.
L 10/16/2021 - 01:17:27: Info (map "de_dust2_2x2") (file "addons/amxmodx/logs/error_20211016.log")
L 10/16/2021 - 01:17:27: [AMXX] Displaying debug trace (plugin "VoteBan_Menu.amxx", version "1.1")
L 10/16/2021 - 01:17:27: [AMXX] Run time error 4: index out of bounds
L 10/16/2021 - 01:17:27: [AMXX]    [0] VoteBan_Menu.sma::ReasonsMenuHandler (line 243)
 
Назад
Сверху