0%
Обязательно ознакомьтесь с правилами форума!
Требуются люди в Команду форума для наполнения сайта ресурсами и полезным контентом. Писать в Telegram: @g_r_e_a_t_z_a_r_a_z_a
Чат для серверодержателей CS 1.6

Чат для серверодержателей Counter-Strike 1.6 а так же владельцев сайтов на движке GameCMS

Сообщество администраторов, разработчиков и владельцев серверов

GameCMS обсуждение Разработка плагинов Администрирование Опытные специалисты Безопасность и оптимизация
Рекламное место

Рекламное место свободно

Разместите свою рекламу прямо здесь!

Активная аудитория Высокая конверсия Доступная цена Эффективная реклама
VoteBan Menu

CS 1.6 Amxx 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);
}
Верх Низ