VoteBan Menu

Плагин АМХХ VoteBan Menu 1.1

Нет прав для скачивания
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));

    for(new i; i < g_iVoteBanPlayersNum; ++i) {
        if(g_iVoteBanPlayers[i] != g_iVictim)
            menu_display(g_iVoteBanPlayers[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);
}
Назад
Сверху