Добавления проверки на игрока

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
33
Реакции
0
Помогите добавить , проверку на игроков , что бы команды /voteban и /votekick работали когда на сервере не меньше чем 4 игрока, пожалуйста

Код:
#include <amxmodx>

const VOTE_DELAY    = 5;    // Интервалы между голосованиями
const VOTE_TIME        = 10;    // Длительность голосования
const VOTE_PERCENT    = 60;    // Проценты для успешного голосования
const BAN_TYPE        = 1;     // 0 - кик; 1 - amxbans/fresh bans/lite bans; 2 - superban
#define KICK_INSIDER        // Удалять с сервера инсайдера голосования, если недостаточно голосов
const ADMIN_FLAG     = ADMIN_BAN;        // Флаг админа, в присутствии которого, голосование нельзя запустить
const IMMUN_FLAG    = ADMIN_IMMUNITY;       // Флаг иммунитета к кику/бану
new const PREFIX[]     = "Голосование";       // Префикс в чате
new const BAN_PREFIX[]    = "VoteBan";      // Префикс причины при бане
new const KICK_PREFIX[]    = "VoteKick";      // Префикс причины при кике
new g_arrBanTimes[] =
    // Время бана
{
    30,
    60,
    120,
    180,
    360,
    1440,
    2880
};
new g_arrBanReasons[][64] =
    // Причины бана
{
    "Aim",
    "Wallhack",
    "Speadhack",
    "Мат/Оскорбление",
    "Школьник/ Нет 18+",
    "Большой Пинг"
};
new g_arrKickReasons[][64] =
    // Причины кика
{
    "Реклама/Флуд/Спам",
    "Мат/Оскорбление",
    "Большой Пинг",
    "Школьник/ Нет 18+",
    "Микрофон/ Шум",
    "Мешает Играть"
};

#if !defined MAX_PLAYERS
    const MAX_PLAYERS = 32;
#endif
enum VoteMenus
{
    Ban,
    Kick,
   
    LAST // don't modify
};
enum StaticMenus
{
    ReasonsMenu,
    VotesMenu
};
enum MenuStruct
{
    VoteMenus:Menu,
    Pos,
    Setting,
    ReasonId
};
enum VoteData
{
    Insider,
    Victim,
    LastVote,
   
    numPlayersOnVote,
    bool:bVoted[MAX_PLAYERS + 1],
    votes
};

new g_iVote[VoteMenus][VoteData];
new g_iAnyVote[VoteMenus][StaticMenus], g_iUsersVoteMenu;
new g_iVoteMenu[MAX_PLAYERS + 1][MenuStruct];
new g_iPlayers[MAX_PLAYERS + 1][MAX_PLAYERS];

#if AMXX_VERSION_NUM < 183
    #include <colorchat>
    #define client_disconnected client_disconnect
#endif

public plugin_init()
{
    register_plugin("Player Votes", "1.0", "neugomon");
   
    register_clcmd("say /voteban", "clcmd_VoteBan");
    register_clcmd("say /votekick", "clcmd_VoteKick");
   
    register_menucmd(register_menuid("PlayerVotes Menu"), 1023, "PlayersMenuHandler");
}

public plugin_cfg()
{
    g_iAnyVote[Ban][ReasonsMenu] = menu_create("\d[\rPlayerVoteBan\d] \wВыберите причину", "ReasonsMenuHandler");
    g_iAnyVote[Kick][ReasonsMenu] = menu_create("\d[\rPlayerVoteKick\d] \wВыберите причину", "ReasonsMenuHandler");
   
    menu_setprop(g_iAnyVote[Ban][ReasonsMenu], MPROP_NEXTNAME, "Далее");
    menu_setprop(g_iAnyVote[Ban][ReasonsMenu], MPROP_BACKNAME, "Назад");
    menu_setprop(g_iAnyVote[Ban][ReasonsMenu], MPROP_EXITNAME, "Выход");
    menu_setprop(g_iAnyVote[Kick][ReasonsMenu], MPROP_NEXTNAME, "Далее");
    menu_setprop(g_iAnyVote[Kick][ReasonsMenu], MPROP_BACKNAME, "Назад");
    menu_setprop(g_iAnyVote[Kick][ReasonsMenu], MPROP_EXITNAME, "Выход");

    for(new i, str[3]; i < sizeof g_arrBanReasons; i++)
    {
        num_to_str(i, str, charsmax(str));
        menu_additem(g_iAnyVote[Ban][ReasonsMenu], g_arrBanReasons[i], str);
    }
    for(new i, str[3]; i < sizeof g_arrKickReasons; i++)
    {
        num_to_str(i, str, charsmax(str));
        menu_additem(g_iAnyVote[Kick][ReasonsMenu], g_arrKickReasons[i], str);
    }
   
    g_iUsersVoteMenu = menu_create("TITLE", "VotesMenuHandler");
   
    menu_setprop(g_iUsersVoteMenu, MPROP_EXIT, MEXIT_NEVER);
   
    menu_additem(g_iUsersVoteMenu, "\rДа", "1");
    menu_additem(g_iUsersVoteMenu, "\yНет", "0");
}

public client_disconnected(id)
{
    if(g_iVote[Ban][bVoted][id])
    {
        g_iVote[Ban][bVoted][id] = false;
        g_iVote[Ban][votes]--;
    }
    if(g_iVote[Kick][bVoted][id])
    {
        g_iVote[Kick][bVoted][id] = false;
        g_iVote[Kick][votes]--;
    }
}

public clcmd_VoteBan(id)
{
    if(HasAdminInServer(id))
        return PLUGIN_HANDLED;
    if(IsVoteDenied(id, Ban))
        return PLUGIN_HANDLED;
       
    g_iVote[Ban][Insider]  = id;
    g_iVote[Ban][LastVote] = get_systime();
   
    g_iVoteMenu[id][Menu] = any:Ban;
    g_iVoteMenu[id][Pos] = 0;
    g_iVoteMenu[id][Setting] = 0;
   
    BuildMenu(id, g_iVoteMenu[id][Pos]);
   
    return PLUGIN_HANDLED;
}

public clcmd_VoteKick(id)
{
    if(HasAdminInServer(id))
        return PLUGIN_HANDLED;
    if(IsVoteDenied(id, Kick))
        return PLUGIN_HANDLED;
       
    g_iVote[Kick][Insider]  = id;
    g_iVote[Kick][LastVote] = get_systime();
   
    g_iVoteMenu[id][Menu] = any:Kick;
    g_iVoteMenu[id][Pos] = 0;
    g_iVoteMenu[id][Setting] = 0;
   
    BuildMenu(id, g_iVoteMenu[id][Pos]);
   
    return PLUGIN_HANDLED;
}

public PlayersMenuHandler(id, iKey)
{
    switch(iKey)
    {
        case 7:
        {
            switch(VoteMenus:g_iVoteMenu[id][Menu])
            {
                case Ban:
                {
                    if(++g_iVoteMenu[id][Setting] > charsmax(g_arrBanTimes))
                        g_iVoteMenu[id][Setting] = 0;
               
                    BuildMenu(id, g_iVoteMenu[id][Pos]);
                }
                case Kick: VoteKickHandler(id, g_iPlayers[id][g_iVoteMenu[id][Pos] * 8 + iKey]);
            }
           
        }
        case 8: BuildMenu(id, ++g_iVoteMenu[id][Pos]);
        case 9:
        {
            if(g_iVoteMenu[id][Pos])
                BuildMenu(id, --g_iVoteMenu[id][Pos]);
            else
            {
                g_iVote[g_iVoteMenu[id][Menu]][Insider]  = 0;
                g_iVote[g_iVoteMenu[id][Menu]][LastVote] = 0;
            }
        }
        default:
        {  
            switch(VoteMenus:g_iVoteMenu[id][Menu])
            {
                case Ban: VoteBanHandler(id, g_iPlayers[id][g_iVoteMenu[id][Pos] * 7 + iKey]);
                case Kick: VoteKickHandler(id, g_iPlayers[id][g_iVoteMenu[id][Pos] * 8 + iKey]);
            }
        }
    }
    return PLUGIN_HANDLED;
}

public ReasonsMenuHandler(id, menu, item)
{
    new _access, callback, szReasonID[3];
    menu_item_getinfo(menu, item, _access, szReasonID, charsmax(szReasonID), .callback = callback);
   
    g_iVoteMenu[id][ReasonId] = str_to_num(szReasonID);
    VoteHandler(id, g_iVoteMenu[id][Menu]);
    return PLUGIN_HANDLED;
}

public VotesMenuHandler(id, menu, item)
{
    new _access, callback, szVote[2];
    menu_item_getinfo(menu, item, _access, szVote, charsmax(szVote), .callback = callback);
   
    if(str_to_num(szVote))
    {
        g_iVote[VoteMenus:GetCurrentVote()][bVoted][id] = true;
        g_iVote[VoteMenus:GetCurrentVote()][votes]++;
    }
}

public CheckResults(VoteMenus:menu)
{
    show_menu(0, 0, "^n", 1);
   
    if(!is_user_connected(g_iVote[menu][Victim]))
    {
        g_iVote[menu][Insider]= 0;
        g_iVote[menu][Victim] = 0;
       
        client_print_color(g_iVote[menu][Insider], print_team_default, "^1[^4%s^1] Игрок покинул сервер!", PREFIX);
        return;
    }
   
    new minVotes = floatround(g_iVote[menu][numPlayersOnVote] * VOTE_PERCENT / 100.0);
    new szVictimName[32];
    get_user_name(g_iVote[menu][Victim], szVictimName, charsmax(szVictimName));
   
    new szVoteTo[15];
    switch(menu)
    {
        case Ban: formatex(szVoteTo, charsmax(szVoteTo), "Ban");
        case Kick:formatex(szVoteTo, charsmax(szVoteTo), "Kick");
    }
   
    if(minVotes > g_iVote[menu][votes])
    {
        client_print_color(
            0,
            print_team_default,
            "^1[^4%s^1] Голосование завершено! Игрок ^3%s ^1не был ^3забанен^1! ^1[^4Голосов: ^3%d ^1| ^4Необходимо: ^3%d^1]",
                PREFIX,
                szVictimName,
                g_iVote[menu][votes],
                minVotes
        );
        log_amx(
            "Vote to %s FAILED. Player ^"%s^" [Reason: ^"%s^"][Vote: %d | MinVote: %d]",
                szVoteTo,  
                szVictimName,
                g_arrBanReasons[g_iVoteMenu[g_iVote[menu][Insider]][ReasonId]],
                g_iVote[menu][votes],
                minVotes
        );  
    #if defined KICK_INSIDER
        server_cmd("kick #%d ^"Злоупотребление Vote%s функцией!^"", get_user_userid(g_iVote[menu][Insider]), szVoteTo);
    #endif
    }
    else
    {
        switch(menu)
        {
            case Ban:
            {
                switch(BAN_TYPE)
                {
                    case 0:
                    {          
                        server_cmd(
                            "kick #%d ^"[%s] %s^"",
                                get_user_userid(g_iVote[Ban][Victim]),
                                BAN_PREFIX,
                                g_arrBanReasons[g_iVoteMenu[g_iVote[Ban][Insider]][ReasonId]]
                        );
                    }
                    case 1:
                    {
                        server_cmd(
                            "amx_ban %d #%d ^"[%s] %s^"",
                                g_arrBanTimes[g_iVoteMenu[g_iVote[Ban][Insider]][Setting]],
                                get_user_userid(g_iVote[Ban][Victim]),
                                BAN_PREFIX,
                                g_arrBanReasons[g_iVoteMenu[g_iVote[Ban][Insider]][ReasonId]]
                        );
                    }
                    case 2:
                    {
                        server_cmd(
                            "amx_superban #%d %d ^"[%s] %s^"",
                                get_user_userid(g_iVote[Ban][Victim]),
                                g_arrBanTimes[g_iVoteMenu[g_iVote[Ban][Insider]][Setting]],
                                BAN_PREFIX,
                                g_arrBanReasons[g_iVoteMenu[g_iVote[Ban][Insider]][ReasonId]]
                        );
                    }
                }
            }
            case Kick:
            {          
                server_cmd(
                    "kick #%d ^"[%s] Причина %s^"",
                    get_user_userid(g_iVote[Kick][Victim]),
                    KICK_PREFIX,
                    g_arrBanReasons[g_iVoteMenu[g_iVote[Kick][Insider]][ReasonId]]
                );
            }
        }
       
        client_print_color(
            0,
            print_team_default,
            "^1[^4%s^1] Голосование завершено! Игрок ^3%s ^1был ^3забанен^1! ^1[^4Голосов: ^3%d ^1| ^4Необходимо: ^3%d^1]",
                PREFIX,
                szVictimName,
                g_iVote[menu][votes],
                minVotes
        );
        log_amx(
            "Vote to %s SUCCESS. Player ^"%s^" [Reason: ^"%s^"][Vote: %d | MinVote: %d]",
                szVoteTo,  
                szVictimName,
                g_arrBanReasons[g_iVoteMenu[g_iVote[menu][Insider]][ReasonId]],
                g_iVote[menu][votes],
                minVotes
        );
    }
   
    g_iVote[menu][Insider]= 0;
    g_iVote[menu][Victim] = 0;
}

BuildMenu(id, pos)
{
    new pnum;
    get_players(g_iPlayers[id], pnum, "ch");

    new items;
    new keys  = MENU_KEY_0;
    new iLen, szMenu[512];
   
    switch(VoteMenus:g_iVoteMenu[id][Menu])
    {
        case Ban:
        {
            items = 7;
            keys |= MENU_KEY_8;
           
            iLen = formatex(
                szMenu, charsmax(szMenu),
                "\d[\rPlayerVoteBan\d] \yВыберите игрока\w\R%d/%d^n^n",
                    pos + 1,
                    (pnum / items + ((pnum % items) ? 1 : 0))
            );
        }
        case Kick:
        {
            items = 8;
           
            iLen = formatex(
                szMenu, charsmax(szMenu),
                "\d[\rPlayerVoteKick\d] \yВыберите игрока\w\R%d/%d^n^n",
                    pos + 1,
                    (pnum / items + ((pnum % items) ? 1 : 0))
            );
        }
    }
   
    new start = pos * items;
    new end   = start + items;
   
    if(start >= pnum)
        start = pos = g_iVoteMenu[id][Pos] = 0;
    if(end > pnum)
        end = pnum;

    for(new i = start, a, pid, szName[32]; i < end; i++)
    {
        pid = g_iPlayers[id][i];
        get_user_name(pid, szName, charsmax(szName));

        if(id == pid)
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s \y[\rЭто Вы\y]^n", ++a, szName);
        else if(get_user_flags(pid) & IMMUN_FLAG)
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s \y[\rИммунитет\y]^n", ++a, szName);
        else
        {
            keys |= (1 << a++);
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", a, szName);
        }
    }
   
    switch(VoteMenus:g_iVoteMenu[id][Menu])
    {
        case Ban:
        {
            new szEnding[10], iBanTime = GetEnding(g_arrBanTimes[g_iVoteMenu[id][Setting]], szEnding, charsmax(szEnding));
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r8. \wЗабанить на \y%d \w%s^n", iBanTime, szEnding);
        }
    }

    if(end != pnum)
    {
        formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r9. \yДалее^n\r0. \r%s", pos ? "Назад" : "Выход");
        keys |= MENU_KEY_9;
    }
    else     formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r0. \r%s", pos ? "Назад" : "Выход");

    return show_menu(id, keys, szMenu, -1, "PlayerVotes Menu");
}

VoteBanHandler(id, pid)
{
    if(!is_user_connected(pid))
    {
        client_print_color(id, print_team_default, "^1[^4%s^1] Игрок покинул сервер!", PREFIX);
        return;
    }
   
    g_iVote[Ban][Victim] = pid;
    menu_display(id, g_iAnyVote[Ban][ReasonsMenu], 0);
}

VoteKickHandler(id, pid)
{
    if(!is_user_connected(pid))
    {
        client_print_color(id, print_team_default, "^1[^4%s^1] Игрок покинул сервер!", PREFIX);
        return;
    }
   
    g_iVote[Kick][Victim] = pid;
    menu_display(id, g_iAnyVote[Kick][ReasonsMenu], 0);
}

VoteHandler(id, VoteMenus:menu)
{
    g_iVote[menu][votes] = 0;
    arrayset(g_iVote[menu][bVoted], false, sizeof g_iVote[][bVoted]);

    new szInsiderName[32], szVictimName[32];
    new szVoteTo[32], szTitle[256];
   
    get_user_name(id, szInsiderName, charsmax(szInsiderName));
    get_user_name(g_iVote[menu][Victim], szVictimName, charsmax(szVictimName));

    switch(menu)
    {
        case Ban: formatex(szVoteTo, charsmax(szVoteTo), "Забанить");
        case Kick:formatex(szVoteTo, charsmax(szVoteTo), "Кикнуть");
    }
   
    formatex(
        szTitle, charsmax(szTitle),
        "\r%s \y%s\w?^n\rПричина\w: \y%s^n\dЗапустил \r%s",
            szVoteTo,
            szVictimName,
            g_arrBanReasons[g_iVoteMenu[id][ReasonId]],
            szInsiderName
    );
    menu_setprop(g_iUsersVoteMenu, MPROP_TITLE, szTitle);
   
    new players[MAX_PLAYERS];
    get_players(players, g_iVote[menu][numPlayersOnVote], "ch");
    for(new i; i < g_iVote[menu][numPlayersOnVote]; i++)
    {
        if(players[i] != g_iVote[menu][Victim])
            menu_display(players[i], g_iUsersVoteMenu);
    }
   
    set_task(float(VOTE_TIME), "CheckResults", any:menu);
}

GetEnding(minutes, szEnding[], len)
{
    if(minutes / 10080 > 0)
    {
        formatex(szEnding, len, "нед.");
        return minutes / 10080;
    }
    else if(minutes / 1440 > 0)
    {
        formatex(szEnding, len, "дн.");
        return minutes / 1440;
    }
    else if(minutes / 60 > 0)
    {
        formatex(szEnding, len, "ч.");
        return minutes / 60;
    }
   
    formatex(szEnding, len, "мин.");
    return minutes;
}

GetCurrentVote()
{
    for(new i; i < any:LAST; i++)
    {
        if(g_iVote[VoteMenus:i][Insider])
            return i;
    }
    return -1;
}

bool:HasAdminInServer(id)
{
    if(get_user_flags(id) & ADMIN_FLAG)
    {
        client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! Вы - администратор!", PREFIX);
        return true;
    }

    new players[MAX_PLAYERS], pnum;
    get_players(players, pnum, "ch");
    for(new i; i < pnum; i++)
    {
        if(id == players[i])
            continue;
        if(~get_user_flags(players[i]) & ADMIN_FLAG)
            continue;
       
        client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! На сервере ^3есть ^1администратор!", PREFIX);
        return true;
    }
   
    return false;
}

bool:IsVoteDenied(id, VoteMenus:menu)
{
    if(GetCurrentVote() != -1)
    {
        client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3уже запущено^1!", PREFIX);
        return true;
    }
   
    new diff = ((g_iVote[menu][LastVote] + VOTE_DELAY * 60) - get_systime());
    if(diff > 0)
    {
        client_print_color(
            id,
            print_team_default,
            "^1[^4%s^1] Голосование ^3запрещено^1! Следующее голосование будет доступно через ^3%d ^1мин ^3%d ^1сек",
                PREFIX,
                (diff / 60),
                (diff % 60)
        );
        return true;
    }
   
    return false;
}
 

Вложения

Сообщения
957
Реакции
1,185
Помог
52 раз(а)
дабы по 10 раз не получать одни и те же данные можешь сюда вписать:

Diff:
bool:HasAdminInServer(id)
{
    if(get_user_flags(id) & ADMIN_FLAG)
    {
        client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! Вы - администратор!", PREFIX);
        return true;
    }

    new players[MAX_PLAYERS], pnum;
    get_players(players, pnum, "ch");
+   if(pnum <= 4)
+       return true;
    for(new i; i < pnum; i++)
    {
        if(id == players[i])
            continue;
        if(~get_user_flags(players[i]) & ADMIN_FLAG)
            continue;
     
        client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! На сервере ^3есть ^1администратор!", PREFIX);
        return true;
    }
 
    return false;
}
 
Последнее редактирование:
Сообщения
33
Реакции
0
Sonyx, Скомпилировал . и добавил на серв , играло 2 человека , Зашёл с Обычной кс без админки, вотебан работает . нет ограничения на игрока
 
Сообщения
33
Реакции
0
Sonyx, подскажи как добавить оповещения в чат . ну типа мало игроков для такой команды и.т.д???
9 Дек 2017
Sonyx, Я извиняюсь , но сейчас вообще не компилируется !!
 
Сообщения
94
Реакции
64
Помог
5 раз(а)
flexcorejzzz, пробуй
Diff:
bool:HasAdminInServer(id)
{
    if(get_user_flags(id) & ADMIN_FLAG)
    {
        client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! Вы - администратор!", PREFIX);
        return true;
    }

    new players[MAX_PLAYERS], pnum;
    get_players(players, pnum, "ch");
   
    if(pnum <= 4)
    {
+       client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! Мало игроков на сервере!", PREFIX);
        return true;
    }
   
    for(new i; i < pnum; i++)
    {
        if(id == players[i])
            continue;
        if(~get_user_flags(players[i]) & ADMIN_FLAG)
            continue;
       
        client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! На сервере ^3есть ^1администратор!", PREFIX);
        return true;
    }
   
    return false;
}
 
Последнее редактирование модератором:
Сообщения
33
Реакции
0
Dager, Работает , спасибо Дружище, ты меня выручаешь ))
9 Дек 2017
ВОПРОС РЕШИЛСЯ )
 
Статус
В этой теме нельзя размещать новые ответы.

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

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