Настройка вотебана Another Voteban 1.7

Статус
В этой теме нельзя размещать новые ответы.

Nuriddin

Пользователь
Регистрация
6 Фев 2019
Сообщения
88
Симпатии
0
Предупреждения
30
Здравствуйте! Подскажите пожалуйста как сделать так чтобы игроки не могли писать свои причину.] Yet Another Voteban 1.7 AndrewZ/voed/wop yet_another_vot running
Исходник не открывается, я пытался разобраться, но не получилось)
 

Vesuvius

НЕ СКРИПТЕР!!!
Команда форума
Администратор
Регистрация
8 Июн 2017
Сообщения
1.598
Симпатии
570
Пол
Мужской
Nuriddin, какое значение
Код:
yav_ban_reason
 

r1nk0

Пользователь
Регистрация
3 Окт 2018
Сообщения
258
Симпатии
53
Код:
; "0" = ручной ввод + заранее подготовленные причины;
; "1" = только ручной ввод;
; "2" = только заранее подготовленные причины.
; По умолчанию: "0"
yav_ban_reason "0"
 

Vesuvius

НЕ СКРИПТЕР!!!
Команда форума
Администратор
Регистрация
8 Июн 2017
Сообщения
1.598
Симпатии
570
Пол
Мужской
r1nk0, ну так ставте 2
 

Nuriddin

Пользователь
Регистрация
6 Фев 2019
Сообщения
88
Симпатии
0
Предупреждения
30
Проблема в том что у меня не открывается исходник. В хостинге[DOUBLEPOST=1579520897][/DOUBLEPOST]Хочу написать свои причины, чтобы игроки не могли писать всякую ерунду.
 

Nuriddin

Пользователь
Регистрация
6 Фев 2019
Сообщения
88
Симпатии
0
Предупреждения
30
Понятно. Вечером посмотрю
 

Nuriddin

Пользователь
Регистрация
6 Фев 2019
Сообщения
88
Симпатии
0
Предупреждения
30
В ланг нет всё это
Код:

; "0" = ручной ввод + заранее подготовленные причины;
; "1" = только ручной ввод;
; "2" = только заранее подготовленные причины.
; По умолчанию: "0"
yav_ban_reason "0"
Г
В какой папке всё это можно найти?
 

Vesuvius

НЕ СКРИПТЕР!!!
Команда форума
Администратор
Регистрация
8 Июн 2017
Сообщения
1.598
Симпатии
570
Пол
Мужской
Nuriddin, ето добавь в amxx.cfg

C++:
; Стандартное время бана в минутах, доступное игрокам.
; По умолчанию: "5"
yav_time_default "5"
 
; Дополнительное время бана в минутах для игроков с флагом доступа "yav_time_access".
; От 1 до 5 значений через пробел.
; По умолчанию: "5 15 30 60 180"
yav_time "5 15 30 60 180"
 
; Тип бана:
; "-2"   — BANID (STEAMID);
; "-1"   — ADDIP;
; "1"   — AMXBANS;
; "2"   — FRESHBANS;
; "3"   — ADVANCED BANS;
; "4"   — SUPERBAN;
; "5"   — MULTIBAN.
; По умолчанию: "2"
yav_ban_type "2"
 
; Выбор причны бана.
;   Причины добавляются в файл \\data\lang\yet_another_voteban.txt для каждого из языков в неограниченном количестве.
;   Если лень переводить, то можете добавлять только для одного основного языка — это на ваше усмотрение. Но в таком случае удалите ключи причин у остальных языков, чтобы не конфликтовали.
;   Обязательно нумеруйте названия ключей, т.е  VOTEBAN_ADD_REASON_1,  VOTEBAN_ADD_REASON_2 и т.д...
;   Пример: VOTEBAN_ADD_REASON_1 = Читы.
; "0" = ручной ввод + заранее подготовленные причины;
; "1" = только ручной ввод;
; "2" = только заранее подготовленные причины.
; По умолчанию: "0"
yav_ban_reason "0"
 
; Задержка между голосованиями для каждого игрока отдельно.
; По умолчанию: "5"
yav_delay "5"
 
; Длительность голосования в секундах.
; По умолчанию: "15"
yav_duration "15"
 
; Необходимый процент проголосовавших игроков для осуществления бана.
; По умолчанию: "60"
yav_percent "60"
 
; Необходимый минимум голосов за бан для того, чтобы голосование вообще могло состояться.
; Минимальное значение: "2"
; По умолчанию: "2"
yav_min_votes "2"
 
; Учитывать ли админов в команде наблюдателей как активных при подборе для оповещения, при установленном значении "yav_admin_access".
; "1" = учитывать;
; "0" = пропускать.
; По умолчанию: "0"
yav_spec_admins "0"
 
; Блокировка вызова голосования в начале раунда, в секундах. Например, чтобы не сбивать меню покупки игрокам.
; Укажите положительное дробное или целое значение для блокировки на указанное время, либо:
; "-1" = блокировка до конца mp_buytime;
; "-2" = блокировка до конца mp_freezetime;
;  "0" = отключить, не блокировать.
; По умолчанию: "-2"
yav_roundstart_delay "-2"
 
 
; При указани флагов можно назначить несколько: "abc", либо оставить пустым "", чтобы отключить функцию/разрешить использовать всем:
 
; Флаг(и) доступа к меню голосования.
; По умолчанию: ""
yav_access ""
 
; Флаг(и) доступа к выбору времени бана "yav_time" и к голосованию без задржки "yav_delay".
; По умолчанию: "с"
yav_time_access "с"
 
; Флаг(и) админа для блока голосования и включения оповещения админов.
; По умолчанию: "d"
yav_admin_access "d"
 
; Флаг(и) иммунитета к вотебану.
; По умолчанию: "a"
yav_immunity_access "a"
 
; Логирование банов в файл (\\addons\amxmodx\logs\YAV_ГГГГММДД.log).
; "0" = выкл;
; "1" = вкл.
; По умолчанию: "1"
yav_log_to_file "1"
кстате какая версия amxmod?
 

Vesuvius

НЕ СКРИПТЕР!!!
Команда форума
Администратор
Регистрация
8 Июн 2017
Сообщения
1.598
Симпатии
570
Пол
Мужской
Nuriddin, да! все квари которие указани више!
 

Nuriddin

Пользователь
Регистрация
6 Фев 2019
Сообщения
88
Симпатии
0
Предупреждения
30
У меня по-другому. Поэтому я не разобрался[DOUBLEPOST=1579538844][/DOUBLEPOST]
Код:
/*   
*    Yet Another Voteban AMXX Plugin
*
*    — удобный и симпатичный голосовальщик за бан игроков
*    для Ваших великолепных серверов Counter-Strike 1.6.
*
*
*     Авторы: AndrewZ и voed.
*
*
*    Переменные плагина:
*
*    yav_time_default "5"         — стандартное время бана в минутах, доступное для простых смертных (1 значение).
*    yav_time "5 20 15 30 60 180"     — дополнительное время бана для игроков с флагом доступа "yav_time_access" (от 1 до 5 значений, через пробел).
*    yav_ban_type "1"         — тип бана: -2 = BANID (STEAMID); -1 = ADDIP; 1 = AMXBANS; 2 = FRESHBANS; 3 = ADVANCED BANS; 4 = SUPERBAN; 5 = MULTIBAN.
*    yav_delay "5"             — задержка между голосованиями, в минутах.
*    yav_duration "15"        — длительность голосования.
*    yav_percent "60"        — необходимый процент проголосовавших игроков для осуществления бана (1-100).
*    yav_min_players "3"        — минимум игроков на сервере для возможности открыть меню голосования.
*    yav_spec_admins "0"        — учитывать ли админов в команде наблюдателей как активных админов. (1 - учитывать, 0 - пропускать)
*    yav_roundstart_delay "-1"    — блокировка вызова голосования в начале раунда, в секундах. (Целое или дробное положительное значение - блокировка на указанное время, "-1" - блокировка до конца mp_buytime, "0" - отключить, не блокировать)
*    yav_access ""            — флаг доступа к меню голосования. (Можно указать несколько: "abc", либо оставить пустым "", чтобы разрешить использовать всем).
*    yav_time_access "c"        — флаг доступа к выбору времени бана и к голосованию без кулдауна. (Можно указать несколько: "abc", либо оставить пустым "", чтобы отключить).
*    yav_admin_access "d"        — флаг админа для блока голосования и включения оповещения админов. (Можно указать несколько: "abc", либо оставить пустым "", чтобы отключить).
*    yav_immunity_access "a"        — флаг иммунитета к вотебану. (Можно указать несколько: "abc", либо оставить пустым "", чтобы отключить).
*    yav_log_to_file "1"        — логирование банов в файл "addons\amxmodx\logs". Название логов "YAV_ГГГГДДММ.log".
*/

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

#define PLUGIN        "Yet Another Voteban"
#define VERSION        "1.7"
#define AUTHOR        "AndrewZ/voed/wopox1337"

#define PDATA_SAFE        2
#define OFFSET_LINUX        5
#define OFFSET_CSMENUCODE    205

#define MAX_PLAYERS        32
#define MSGS_PREFIX        "YAV"

#define TID_ENDVOTE     5051
#define TID_BLOCKVOTE     5052

enum
{
    MENU_SOUND_SELECT, // 0
    MENU_SOUND_DENY, // 1
    MENU_SOUND_SUCCESS // 2
}

new g_pcvr_DefaultTime, g_pcvr_Time, g_pcvr_BanType, g_pcvr_Delay,
    g_pcvr_Duration, g_pcvr_Percent, g_pcvr_MinPlayers, g_pcvr_SpecAdmins,
    g_pcvr_RoundStartDelay, g_pcvr_mpBuyTime,
    g_pcvr_Access, g_pcvr_TimeAccess, g_pcvr_AdminAccess, g_pcvr_ImmunityAccess,
    g_pcvr_LogToFile

new g_szMenuSounds[][] =
{
    "buttons/lightswitch2.wav", // 0
    "buttons/button2.wav", // 1
    "buttons/blip1.wav" // 2
}

new g_szUserReason[ MAX_PLAYERS + 1 ][ 26 ],
    g_iUserSelectedID[ MAX_PLAYERS + 1 ],
    g_iUserBanTime[ MAX_PLAYERS + 1 ],
    g_iTotalVotes[ MAX_PLAYERS + 1 ],
    g_iUserGametime[ MAX_PLAYERS + 1 ]

new g_szInitiator[ 3 ][ 35 ],
    g_iBanID,
    g_iBanTime,
    g_szBanReason[ 26 ]
    
new bool:g_bIsVoteStarted, bool:g_bIsVoteBlocked
new g_szParsedCvarTime[ 5 ][ 8 ]

public plugin_precache()
{
    new i
    
    for( i = 0; i < sizeof g_szMenuSounds; i ++ )
        precache_sound( g_szMenuSounds[ i ] )
}

public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )
    
    g_pcvr_DefaultTime =         register_cvar( "yav_time_default", "5" )
    g_pcvr_Time =                 register_cvar( "yav_time", "5 15 30 60 180" )
    g_pcvr_BanType =             register_cvar( "yav_ban_type", "2" )
    g_pcvr_Delay =                 register_cvar( "yav_delay", "5" )
    g_pcvr_Duration =            register_cvar( "yav_duration", "15" )
    g_pcvr_Percent =             register_cvar( "yav_percent", "60" )
    g_pcvr_MinPlayers =         register_cvar( "yav_min_players", "3" )
    g_pcvr_SpecAdmins =         register_cvar( "yav_spec_admins", "0" )
    g_pcvr_RoundStartDelay =    register_cvar( "yav_roundstart_delay", "-1" )
    g_pcvr_Access =             register_cvar( "yav_access", "" )
    g_pcvr_TimeAccess =         register_cvar( "yav_time_access", "c" )
    g_pcvr_AdminAccess =         register_cvar( "yav_admin_access", "d" )
    g_pcvr_ImmunityAccess =     register_cvar( "yav_immunity_access", "a" )
    g_pcvr_LogToFile =            register_cvar( "yav_log_to_file", "1" )
    
    g_pcvr_mpBuyTime =             register_cvar( "mp_buytime", "" )
    
    register_event( "HLTV", "event_newround", "a", "1=0", "2=0" )
    
    register_clcmd( "say /voteban", "show_voteban_players_menu" )
    register_clcmd( "say_team /voteban", "show_voteban_players_menu" )
    register_clcmd( "amx_votebanmenu", "show_voteban_main_menu" )
    
    register_clcmd( "voteban_reason", "cmd_voteban_reason" )

    register_dictionary( "yet_another_voteban.txt" )
}

public plugin_cfg()
{
    new szData[ 44 ]; get_pcvar_string( g_pcvr_Time, szData, charsmax( szData ) )
    
    parse( szData,    g_szParsedCvarTime[ 0 ], 7,
            g_szParsedCvarTime[ 1 ], 7,
            g_szParsedCvarTime[ 2 ], 7,
            g_szParsedCvarTime[ 3 ], 7,
            g_szParsedCvarTime[ 4 ], 7 )
}

public event_newround()
{
    new Float:fCvar
    fCvar = get_pcvar_float( g_pcvr_RoundStartDelay )
    
    if( fCvar == 0.0 )
        return

    if( task_exists( TID_BLOCKVOTE ) )
        remove_task( TID_BLOCKVOTE )
    
    if( fCvar == -1.0 )
        fCvar = get_pcvar_float( g_pcvr_mpBuyTime ) * 60
    
    g_bIsVoteBlocked = true
    set_task( fCvar, "task_unblock_vote", TID_BLOCKVOTE )
}

public task_unblock_vote()
    g_bIsVoteBlocked = false
    
public client_connect( id )
    clear_user_voteban_data( id )

public client_disconnect( id )
    clear_user_voteban_data( id )

public clear_user_voteban_data( id )
{
    g_iUserSelectedID[ id ] = 0
    g_iUserBanTime[ id ] = get_pcvar_num( g_pcvr_DefaultTime )
    arrayset( g_szUserReason[ id ], 0, sizeof( g_szUserReason ) )
    
    if( g_iBanID == id )
        clear_voteban_data()
}

public clear_voteban_data()
{
    if( task_exists( TID_ENDVOTE ) )
        remove_task( TID_ENDVOTE )
    
    g_bIsVoteStarted = false
    g_iBanID = 0
    g_iBanTime = 0
    arrayset( g_szBanReason, 0, sizeof( g_szBanReason ) )
    arrayset( g_iTotalVotes, 0, MAX_PLAYERS + 1 )
}

public cmd_voteban_reason( id )
{
    new i, szArgs[ 26 ], szBlock[][] = { "!g", "!y", "!t", "%", "#", "", "", "", "" }
    
    read_args( szArgs, charsmax( szArgs ) )
    remove_quotes( szArgs )
    
    for( i = 0; i < sizeof( szBlock ); i ++ )
        replace_all( szArgs, charsmax( szArgs ), szBlock[ i ], "" )
    
    g_szUserReason[ id ] = szArgs
    
    show_voteban_main_menu( id )
    
    return PLUGIN_HANDLED
}

public show_voteban_players_menu( id )
{
    if( !is_voteban_available( id ) )
        return PLUGIN_HANDLED
    
    new iMenu, i, szTemp[ 64 ], szName[ 32 ], szFlags[ 23 ], szId[ 3 ]
    
    formatex( szTemp, charsmax( szTemp ), "\y%L\R", id, "VOTEBAN_MENU_PLAYERS_TITLE" ) // Выбор игрока
    iMenu = menu_create( szTemp, "handler_voteban_players_menu" )
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || ( i == id ) )
            continue
        
        get_user_name( i, szName, charsmax( szName ) )
        get_pcvar_string( g_pcvr_ImmunityAccess, szFlags, charsmax( szFlags ) )
        
        if( get_user_flags( i ) & read_flags( szFlags ) )
            formatex( szTemp, charsmax( szTemp ), "\d%s \r*", szName )
        else
            formatex( szTemp, charsmax( szTemp ), "\w%s", szName )
        
        num_to_str( i, szId, charsmax( szId ) )
        
        menu_additem( iMenu, szTemp, szId, ADMIN_ALL )
    }
    
    if( !menu_items( iMenu ) )
    {
        menu_destroy( iMenu )
        return PLUGIN_HANDLED
    }
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_BACK" )
    menu_setprop( iMenu, MPROP_BACKNAME, szTemp )
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_NEXT" )
    menu_setprop( iMenu, MPROP_NEXTNAME, szTemp )
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
    
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
    
    if( pev_valid( id ) == PDATA_SAFE )
        set_pdata_int( id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX )
    
    menu_display( id, iMenu, 0 )
    
    return PLUGIN_HANDLED
}

public handler_voteban_players_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        client_spk( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    new szData[ 3 ], szName[ 32 ], iAccess, iCallback, sId
    menu_item_getinfo( iMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), iCallback )
    
    sId = str_to_num( szData )
    
    if( get_user_status( sId ) )
    {
        new szFlags[ 23 ]
        get_pcvar_string( g_pcvr_ImmunityAccess, szFlags, charsmax( szFlags ) )
    
        if( !( get_user_flags( sId ) & read_flags( szFlags ) ) )
        {
            g_iUserSelectedID[ id ] = sId
            show_voteban_main_menu( id )
            client_spk( id, MENU_SOUND_SELECT )
        }
        else
        {
            show_voteban_players_menu( id )
            yet_another_print_color( id, "%L", id, "VOTEBAN_IMMUNITY" ) // Выбранный игрок имеет иммунитет к бану.
            client_spk( id, MENU_SOUND_DENY )
        }
    }
    else
    {
        yet_another_print_color( id, "%L", id, "VOTEBAN_LEAVE" ) // Выбранный игрок недоступен для выбора, возможно он покинул сервер.
        client_spk( id, MENU_SOUND_DENY )
    }

    menu_destroy( iMenu )
    
    return PLUGIN_HANDLED
}

public show_voteban_main_menu( id )
{
    if( !is_voteban_available( id ) )
        return PLUGIN_HANDLED
    
    new iMenu, szTemp[ 64 ], sId
    
    sId = g_iUserSelectedID[ id ]
    
    formatex( szTemp, charsmax( szTemp ), "\y%L", id, "VOTEBAN_MENU_TITLE" ) // Голосование за бан
    iMenu = menu_create( szTemp, "handler_voteban_main_menu" )

// === 1 ===

    if( get_user_status( sId ) )
    {
        new szName[ 32 ]
        get_user_name( sId, szName, charsmax( szName ) )
        
        formatex( szTemp, charsmax( szTemp ), "%L \y%s", id, "VOTEBAN_MENU_PLAYER", szName ) // Игрок:
    }
    else formatex( szTemp, charsmax( szTemp ), "%L \d%L", id, "VOTEBAN_MENU_PLAYER", id, "VOTEBAN_MENU_SELECT_PLAYER" ) // Выбрать игрока

    menu_additem( iMenu, szTemp, "1", ADMIN_ALL )
    
// =========
    

// === 2 ===

    if( g_szUserReason[ id ][ 0 ] )
        formatex( szTemp, charsmax( szTemp ), "%L \y%s^n", id, "VOTEBAN_MENU_REASON", g_szUserReason[ id ] ) // Причина
        
    else formatex( szTemp, charsmax( szTemp ), "%L \d%L^n", id, "VOTEBAN_MENU_REASON", id, "VOTEBAN_MENU_ENTER_REASON"  ) // Причина || Ввести причину бана
    
    menu_additem( iMenu, szTemp, "2", ADMIN_ALL )
    
// =========
    

// === 3 ===

    new szFlags[ 23 ]
    get_pcvar_string( g_pcvr_TimeAccess, szFlags, charsmax( szFlags ) )
    
    if( get_user_flags( id ) & read_flags( szFlags ) )
    {
        formatex( szTemp, charsmax( szTemp ), "%L \y%i %L^n", id, "VOTEBAN_MENU_TIME", g_iUserBanTime[ id ], id, "VOTEBAN_MENU_MINUTES" ) // Время бана || минут
        menu_additem( iMenu, szTemp, "3", ADMIN_ALL )
    }
    
// =========

// === 4 ===
    
    new iAdmins = get_admins_online()
    
    if( iAdmins )
        formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_NOTIFY", iAdmins ) // Сообщить администратору (\y%d в сети\w)
    else
        formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_START_VOTE" ) // Начать голосование
    
    menu_additem( iMenu, szTemp, "4", ADMIN_ALL )
    
// =========

    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
    
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
    
    if( pev_valid( id ) == PDATA_SAFE )
        set_pdata_int( id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX )
    
    menu_display( id, iMenu, 0 )
    
    return PLUGIN_HANDLED
}

public handler_voteban_main_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        clear_user_voteban_data( id )
        client_spk( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    new szData[ 3 ], szName[ 32 ], iAccess, iCallback, iKey
    menu_item_getinfo( iMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), iCallback )
    
    iKey = str_to_num( szData )
    
    switch( iKey )
    {
        case 1:
        {
            show_voteban_players_menu( id )
            client_spk( id, MENU_SOUND_SELECT )
        }
        
        case 2:
        {
            client_cmd( id, "messagemode voteban_reason" )
            client_spk( id, MENU_SOUND_SELECT )
        }
        
        case 3:
        {
            show_voteban_time_menu( id )
            client_spk( id, MENU_SOUND_SELECT )
        }
        
        case 4:
        {
            new sId = g_iUserSelectedID[ id ]
            
            if( !get_user_status( sId ) )
            {
                yet_another_print_color( id, "%L",  id, "VOTEBAN_NEED_PLAYER" ) // Вы должны выбрать игрока
                show_voteban_main_menu( id )
                client_spk( id, MENU_SOUND_DENY )
            }
            
            else if( !g_szUserReason[ id ][ 0 ] )
            {
                yet_another_print_color( id, "%L",  id, "VOTEBAN_NEED_REASON" ) // Вы должны ввести причину бана
                show_voteban_main_menu( id )
                client_spk( id, MENU_SOUND_DENY )
            }
            
            else
            {   
                new szFlags[ 23 ], iAdmins = get_admins_online()
                
                if( iAdmins )
                {
                    new i, szSelectedName[ 32 ], szName[ 32 ]
                    
                    for( i = 1; i <= MAX_PLAYERS; i ++ )
                    {
                        get_pcvar_string( g_pcvr_AdminAccess, szFlags, charsmax( szFlags ) )
        
                        if( !get_user_status( i ) || !( get_user_flags( i ) & read_flags( szFlags ) ) )
                            continue
                            
                        get_user_name( sId, szSelectedName, charsmax( szSelectedName ) )
                        get_user_name( id, szName, charsmax( szName ) )
                        yet_another_print_color( i, "%L",  i, "VOTEBAN_ADMIN_NOTIFICATION", szName, szSelectedName, g_szUserReason[ id ] ) // %s хочет забанить %s за "%s".
                        client_spk( i, MENU_SOUND_SUCCESS )
                    }
                    
                    yet_another_print_color( id, "%L",  id, "VOTEBAN_ADMIN_NOTIFIED", iAdmins ) // Администраторов уведомлено о вашей жалобе: %d.
                    client_spk( id, MENU_SOUND_SUCCESS )
                    clear_user_voteban_data( id )
                    
                    return PLUGIN_HANDLED
                }
                
                get_pcvar_string( g_pcvr_TimeAccess, szFlags, charsmax( szFlags ) )
                
                get_user_name( id, g_szInitiator[ 0 ], 34 )
                get_user_ip( id, g_szInitiator[ 1 ], 34, 1 )
                get_user_authid( id, g_szInitiator[ 2 ], 34 )
                
                g_iBanID = sId
                g_szBanReason = g_szUserReason[ id ]
                
                if( get_user_flags( id ) & read_flags( szFlags ) )
                    g_iBanTime = g_iUserBanTime[ id ]
                
                else g_iBanTime = get_pcvar_num( g_pcvr_DefaultTime )
                
                clear_user_voteban_data( id )
                
                g_bIsVoteStarted = true
                
                show_voteban_menu( id )
                
                g_iUserGametime[ id ] = floatround( get_gametime() )
                set_task( get_pcvar_float( g_pcvr_Duration ), "task_end_vote", TID_ENDVOTE )
            }
        }
    }
    
    menu_destroy( iMenu )
    
    return PLUGIN_HANDLED
}

public show_voteban_time_menu( id )
{
    new iMenu, i, szTemp[ 190 ]

    formatex( szTemp, charsmax( szTemp ), "\y%L", id, "VOTEBAN_MENU_TIME_TITLE" ) // Выбор срока бана
    iMenu = menu_create( szTemp, "handler_voteban_time_menu" )

    for( i = 0; i < sizeof( g_szParsedCvarTime ); i ++ )
    {
        if( !g_szParsedCvarTime[ i ][ 0 ] )
            break
        
        formatex( szTemp, charsmax( szTemp ), "%s %L", g_szParsedCvarTime[ i ], id, "VOTEBAN_MENU_MINUTES" ) // минут
        
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
    }
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
    
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
    
    if( pev_valid( id ) == PDATA_SAFE )
        set_pdata_int( id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX )
    
    menu_display( id, iMenu, 0 )
    
    return PLUGIN_HANDLED
}

public handler_voteban_time_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        clear_user_voteban_data( id )
        client_spk( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    switch( iItem )
    {
        case 0..4: g_iUserBanTime[ id ] = str_to_num( g_szParsedCvarTime[ iItem ] )
    }
    
    show_voteban_main_menu( id )
    client_spk( id, MENU_SOUND_SELECT )
    
    menu_destroy( iMenu )
    
    return PLUGIN_HANDLED
}

public show_voteban_menu( id )
{
    new i
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || i == g_iBanID )
            continue
        
        new szName[ 32 ], szBanName[ 32 ]
        get_user_name( id, szName, charsmax( szName ) )
        get_user_name( g_iBanID, szBanName, charsmax( szBanName ) )

        client_spk( i, MENU_SOUND_SUCCESS )
        yet_another_print_color( i, "%L", i, "VOTEBAN_WHO_START", szName, szBanName, g_szBanReason ) // начал голосование за бан
        
          if( i == id )
        {
            add_vote( id )
            continue
        }
        
        new iMenu, szTemp[ 64 ]
        
        formatex( szTemp, charsmax( szTemp ), "\y%L", i, "VOTEBAN_MENU_TITLE" ) // Голосование за бан
        iMenu = menu_create( szTemp, "handler_voteban_menu" )
        
        formatex( szTemp, charsmax( szTemp ), "%L", i, "VOTEBAN_MENU_YES" )
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
        
        formatex( szTemp, charsmax( szTemp ), "%L", i, "VOTEBAN_MENU_NO" )
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
        
        menu_addblank( iMenu, 1 )
        
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%s", i, "VOTEBAN_MENU_PLAYER", szBanName ) // Игрок
        menu_addtext( iMenu, szTemp, 1 )
        
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%s", i, "VOTEBAN_MENU_REASON", g_szBanReason ) // Причина
        menu_addtext( iMenu, szTemp, 1 )
        
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%s", i, "VOTEBAN_MENU_INITIATOR", szName ) // Инициатор
        menu_addtext( iMenu, szTemp, 1 )
        
        menu_setprop( iMenu, MPROP_EXIT, MEXIT_NEVER )
        
        menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
        
        if( pev_valid( i ) == PDATA_SAFE )
            set_pdata_int( id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX )
        
        menu_display( i, iMenu, 0 )
    }
}

public handler_voteban_menu( id, iMenu, iItem )
{
    if( iItem == 0 )
        add_vote( id )
    else
    {
        menu_destroy( iMenu )
        client_spk( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    client_spk( id, MENU_SOUND_SELECT )
    
    return PLUGIN_HANDLED
}

public add_vote( id )
{
    if( !get_user_status( id ) )
        return PLUGIN_HANDLED
    
    if( !g_bIsVoteStarted )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_ALREADY_FINISHED" ) // Голосование уже закончено.
        return PLUGIN_HANDLED
    }

    g_iTotalVotes[ g_iBanID ] ++
    
    new iTotalVotes, iNeedVotes
    iTotalVotes = g_iTotalVotes[ g_iBanID ]
    iNeedVotes = get_pcvar_num( g_pcvr_Percent ) * get_players_online() / 100
    
    if( iTotalVotes < iNeedVotes )
    {
        new i, szName[ 32 ]
        
        get_user_name( g_iBanID, szName, charsmax( szName ) )
        
        for( i = 1; i <= MAX_PLAYERS; i ++ )
        {
            if( is_user_connected( i ) )
            {
                if( i != g_iBanID )
                    client_print( i, print_center, "%L", i, "VOTEBAN_VOTE", szName, iTotalVotes, iNeedVotes ) // За бан %s проголосовало: %d, нужно: %d.
            }
        }
    }
    
    else
    {
        ban_player( g_iBanID )
    }
    
    return PLUGIN_HANDLED
}

public ban_player( iBanID )
{
    if( task_exists( TID_ENDVOTE ) )
        remove_task( TID_ENDVOTE )
    
    if( !get_user_status( iBanID ) )
    {
        clear_voteban_data()
        return PLUGIN_HANDLED
    }
    
    new i, szName[ 32 ], szIP[ 16 ], szAuthID[ 35 ], iUserID, iTime
    
    get_user_name( iBanID, szName, charsmax( szName ) )
    get_user_ip( iBanID, szIP, charsmax( szIP ), 1 )
    get_user_authid( iBanID, szAuthID, charsmax( szAuthID ) )
    iUserID = get_user_userid( iBanID )
    iTime = g_iBanTime
    
    switch( get_pcvar_num( g_pcvr_BanType ) )
    {
        case -2: server_cmd( "banid %d ^"%s^" kick", iTime, szAuthID ) // BAN AUTHID (STEAMID)
        case -1: server_cmd( "addip %d %s", iTime, szIP ) // BAN IP
        case 1: server_cmd( "amx_ban %d ^"%s^" ^"[%s] %s^"", iTime, szAuthID, MSGS_PREFIX, g_szBanReason ) // AMXBANS
        case 2: server_cmd( "fb_ban %d #%d ^"[%s] %s^"", iTime, iUserID, MSGS_PREFIX, g_szBanReason ) // FRESH BANS
        case 3: server_cmd( "amx_ban ^"%s^" %d ^"[%s] %s^"", szAuthID, iTime, MSGS_PREFIX, g_szBanReason ) // ADVANCED BANS
        case 4: server_cmd( "amx_superban #%d %d ^"[%s] %s^"", iUserID, iTime, MSGS_PREFIX, g_szBanReason ) // SUPERBAN
        case 5: server_cmd( "amx_multiban #%d %d ^"[%s] %s^"", iUserID, iTime, MSGS_PREFIX, g_szBanReason ) // MULTIBAN
    }
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || ( i == iBanID ) )
            continue
        
        yet_another_print_color( i, "%L", i, "VOTEBAN_BANNED", szName ) // %s забанен через голосование!
    }
    
    if( get_pcvar_num( g_pcvr_LogToFile ) )
    {
        new y, m, d, szTemp[ 32 ]
        
        date( y, m, d )
        formatex( szTemp, charsmax( szTemp ), "YAV_%d%02d%02d.log", y, m, d )
        log_to_file( szTemp, "Player ^"%s^" banned by initiator ^"%s^" for ^"%s^" (STEAM ID %s) (IP %s)", szName, g_szInitiator[ 0 ], g_szBanReason, g_szInitiator[ 2 ], g_szInitiator[ 1 ] )
    }
    
    clear_voteban_data()
    
    return PLUGIN_HANDLED
}

public task_end_vote()
{
    new i
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !is_user_connected( i ) )
            continue
            
        yet_another_print_color( i, "%L",  i, "VOTEBAN_ENDED" ) // Голосование за бан провалено.
    }
    
    clear_voteban_data()
    
    g_bIsVoteStarted = false
}

stock bool:is_voteban_available( id )
{
    if( g_bIsVoteBlocked )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_BLOCKED" ) // В данный момент голосование недоступно.
        return false
    }

    if( g_bIsVoteStarted )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_ALREADY_STARTED" ) // В данный момент уже идёт голосование.
        return false
    }
    
    new szFlags, szCvarsFlags[ 3 ][ 23 ]
    
    szFlags = get_user_flags( id )
    get_pcvar_string( g_pcvr_AdminAccess, szCvarsFlags[ 0 ], charsmax( szCvarsFlags ) )
    get_pcvar_string( g_pcvr_TimeAccess, szCvarsFlags[ 1 ], charsmax( szCvarsFlags ) )
    get_pcvar_string( g_pcvr_Access, szCvarsFlags[ 2 ], charsmax( szCvarsFlags ) )
    
    if( szCvarsFlags[ 2 ][ 0 ] && !( szFlags & read_flags( szCvarsFlags[ 2 ] ) ) )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_NO_ACCESS" ) // К сожалению, у вас нет доступа к голосованию за бан.
        
        return false
    }
    
    if( szFlags & read_flags( szCvarsFlags[ 0 ] ) )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_YOU_ADMIN" ) // Используйте своё бан-меню.
        
        return false
    }
    
    if( g_iUserGametime[ id ] )
    {
        new iInterim, iDelayCvar
        
        iInterim = floatround( get_gametime() ) - g_iUserGametime[ id ]
        iDelayCvar = get_pcvar_num( g_pcvr_Delay )
        
        if( szCvarsFlags[ 1 ][ 0 ] && ( szFlags & read_flags( szCvarsFlags[ 1 ] ) ) )
            return true
        
        else if( iInterim < iDelayCvar * 60 )
        {
            yet_another_print_color( id, "%L",  id, "VOTEBAN_DELAY", ( iDelayCvar - ( iInterim / 60 ) ) + 1 ) // Вы должны подождать еще %d мин. после предыдущего голосования.
            
            return false
        }
    }
    
    if( get_players_online() < get_pcvar_num( g_pcvr_MinPlayers ) )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_NOT_ENOUGH_PLAYERS" ) // Недостаточно игроков, чтобы начать голосование.
        
        return false
    }

    return true
}

stock get_admins_online()
{
    new i, iAdmins, iTeam
    
    iAdmins = 0
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        new szFlags[ 23 ]; get_pcvar_string( g_pcvr_AdminAccess, szFlags, charsmax( szFlags ) )
        
        if( !get_user_status( i ) )
            continue
        
        if( !( get_user_flags( i ) & read_flags( szFlags ) ) )
            continue
            
        if( get_pcvar_num( g_pcvr_SpecAdmins ) )       
            iAdmins ++
        else
        {
            iTeam = get_user_team( i )
            
            if( !( ( iTeam == 2 ) || ( iTeam == 1 ) ) )
                continue
                
            iAdmins ++
        }
    }
    
    return iAdmins
}

stock get_players_online()
{
    new i, iPlayers, iTeam
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) )
            continue
        
        iTeam = get_user_team( i )
        
        if( !( ( iTeam == 2 ) || ( iTeam == 1 ) ) )
            continue

        iPlayers ++
    }
    
    return iPlayers
}

stock client_spk( id, iSoundID )
    client_cmd( id, "spk %s", g_szMenuSounds[ iSoundID ] )
    
stock get_user_status( id )
{
    if( !is_user_connected( id ) || is_user_hltv( id ) || is_user_bot( id ) )
        return 0
        
    return 1
}
    
stock yet_another_print_color( id, szInput[], any:... )
{
    new szMessage[ 190 ]
  
    vformat( szMessage, charsmax( szMessage ), szInput, 3 )
    format( szMessage, charsmax( szMessage ), "^1[^4%s^1] %s", MSGS_PREFIX, szMessage )
    
    replace_all( szMessage, charsmax( szMessage ), "!g", "^4" ) // Green Color
    replace_all( szMessage, charsmax( szMessage ), "!n", "^1" ) // Default Color
    replace_all( szMessage, charsmax( szMessage ), "!t", "^3" ) // Team Color
 
    
#if AMXX_VERSION_NUM < 183

    new i, iNum = 1, iPlayers[ 32 ]
    
    if( id ) iPlayers[ 0 ] = id; else get_players( iPlayers, iNum, "h" )
    {
        for( i = 0; i < iNum; i ++ )
        {
            if( !is_user_connected( iPlayers[ i ] ) )
                continue
                
            message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, iPlayers[ i ] )
            write_byte( iPlayers[ i ] )
            write_string( szMessage )
            message_end()
        }
    }
    
#else
    client_print_color( id, print_team_default, szMessage )
#endif

    return 1
}
 

Вложения

r1nk0

Пользователь
Регистрация
3 Окт 2018
Сообщения
258
Симпатии
53
ты потому что не хочешь даже разбираться,тебе все написали что нужно сделать.
 

Nuriddin

Пользователь
Регистрация
6 Фев 2019
Сообщения
88
Симпатии
0
Предупреждения
30
ты потому что не хочешь даже разбираться,тебе все написали что нужно сделать.
Код:
/*
    Yet Another Voteban AMXX Plugin
        — удобный и симпатичный голосовальщик за бан игроков, для Ваших великолепных серверов Counter-Strike 1.6.
    
    Версия: 1.8
    

     Авторы: AndrewZ и voed.
    
    
    Команды:
    
    say /voteban
        — Меню с выбором игроков для голосования.
    
    say_team /voteban
        — Меню с выбором игроков для голосования.
        
    amx_votebanmenu
        — Главное меню голосования.
        

    Переменные:

    yav_time_default <time in minutes>
        — Стандартное время бана в минутах, доступное игрокам.
        — По умолчанию: "20"
    
    yav_time <time in minutes, up to five values>
        — Дополнительное время бана в минутах для игроков с флагом доступа "yav_time_access".
        — От 1 до 5 значений через пробел.
        — По умолчанию: "5 15 30 60 180"

    yav_ban_type <-2|-1|1|2|3|4|5>
        — Тип бана:
        — "-2"    — BANID (STEAMID);
        — "-1"    — ADDIP;
        — "1"    — AMXBANS;
        — "2"    — FRESHBANS;
        — "3"    — ADVANCED BANS;
        — "4"    — SUPERBAN;
        — "5"    — MULTIBAN.
        — По умолчанию: "2"

    yav_ban_reason <0|1|2>
        — Выбор причны бана.
            — Причины добавляются в файл \\data\lang\yet_another_voteban.txt для каждого из языков в неограниченном количестве.
            — Если лень переводить, то можете добавлять только для одного основного языка — это на ваше усмотрение. Но в таком случае удалите ключи причин у остальных языков, чтобы не конфликтовали.
            — Обязательно нумеруйте названия ключей, т.е  VOTEBAN_ADD_REASON_1,  VOTEBAN_ADD_REASON_2 и т.д...
            — Пример: VOTEBAN_ADD_REASON_1 = Читы.
        — "0" = ручной ввод + заранее подготовленные причины;
        — "1" = только ручной ввод;
        — "2" = только заранее подготовленные причины.
        — По умолчанию: "2"

    yav_delay <time in minutes>
        — Задержка между голосованиями для каждого игрока отдельно.
        — По умолчанию: "5"

    yav_duration <time in seconds>
        — Длительность голосования в секундах.
        — По умолчанию: "15"

    yav_percent <percent>
        — Необходимый процент проголосовавших игроков для осуществления бана.
        — По умолчанию: "60"

    yav_min_votes <number>
        — Необходимый минимум голосов за бан для того, чтобы голосование вообще могло состояться.
        — Минимальное значение: "2"
        — По умолчанию: "2"

    yav_spec_admins <1|0>
        — Учитывать ли админов в команде наблюдателей как активных при подборе для оповещения, при установленном значении "yav_admin_access".
        — "1" = учитывать;
        — "0" = пропускать.
        — По умолчанию: "0"

    yav_roundstart_delay <-2|-1|time in seconds>
        — Блокировка вызова голосования в начале раунда, в секундах. Например, чтобы не сбивать меню покупки игрокам.
        — Укажите положительное дробное или целое значение для блокировки на указанное время, либо:
        — "-1" = блокировка до конца mp_buytime;
        — "-2" = блокировка до конца mp_freezetime;
        — "0" = отключить, не блокировать.
        — По умолчанию: "-2"
    
    При указани флагов можно назначить несколько: "abc", либо оставить пустым "", чтобы отключить функцию/разрешить использовать всем:

    yav_access <flags>
        — Флаг(и) доступа к меню голосования.
        — По умолчанию: ""

    yav_time_access <flags>
        — Флаг(и) доступа к выбору времени бана "yav_time" и к голосованию без задржки "yav_delay".
        — По умолчанию: "с"

    yav_admin_access <flags>
        — Флаг(и) админа для блока голосования и включения оповещения админов.
        — По умолчанию: "d"
        
    yav_immunity_access <flags>
        — Флаг(и) иммунитета к вотебану.
        — По умолчанию: "a"
        
    yav_log_to_file <0|1>
        — Логирование банов в файл (\\addons\amxmodx\logs\YAV_ГГГГММДД.log).
        — "0" = выкл;
        — "1" = вкл.
        — По умолчанию: "1"
*/

//#define DEBUG

#include <amxmodx>

#define PLUGIN        "Yet Another Voteban"
#define VERSION        "1.8"
#define AUTHOR        "AndrewZ/voed"

#define MSGS_PREFIX        "YAV"

#define TID_ENDVOTE        5051
#define TID_BLOCKVOTE    5052

enum
{
    MENU_SOUND_SELECT, // 0
    MENU_SOUND_DENY, // 1
    MENU_SOUND_SUCCESS // 2
}

new g_pcvr_DefaultTime,        g_pcvr_Time,            g_pcvr_BanType,        g_pcvr_BanReason,    g_pcvr_Delay,
    g_pcvr_Duration,        g_pcvr_Percent,            g_pcvr_MinVotes,    g_pcvr_SpecAdmins,    g_pcvr_RoundStartDelay,
    g_pcvr_mpBuyTime,        g_pcvr_mpFreezeTime,    g_pcvr_Access,        g_pcvr_TimeAccess,    g_pcvr_AdminAccess,
    g_pcvr_ImmunityAccess,    g_pcvr_LogToFile

new g_szMenuSounds[][] =
{
    "buttons/lightswitch2.wav", // 0
    "buttons/button2.wav", // 1
    "buttons/blip1.wav" // 2
}

new g_szUserReason[ MAX_PLAYERS + 1 ][ 64 ],
    g_iUserSelectedID[ MAX_PLAYERS + 1 ],
    g_iUserBanTime[ MAX_PLAYERS + 1 ],
    g_iTotalVotes[ MAX_PLAYERS + 1 ],
    g_iUserGametime[ MAX_PLAYERS + 1 ]

new g_szInitiator[ 3 ][ 35 ],
    g_iBanID,
    g_iBanTime,
    g_szBanReason[ 64 ]
    
new bool:g_bIsVoteStarted, bool:g_bIsVoteBlocked
new g_szParsedCvarTime[ 5 ][ 8 ]

public plugin_precache()
{
    new i
    
    for( i = 0; i < sizeof g_szMenuSounds; i ++ )
        precache_sound( g_szMenuSounds[ i ] )
}

public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )
    
    set_pcvar_string( register_cvar( "yav_version", VERSION, FCVAR_SPONLY | FCVAR_SERVER ), VERSION )

    g_pcvr_DefaultTime =        create_cvar( "yav_time_default", "5", _, "Default ban time for all non-privileged players." )
    g_pcvr_Time =                create_cvar( "yav_time", "5 15 30 60 180", _, "From 1 to 5 additional ban times for 'yav_time_access' cvar." )
    g_pcvr_BanType =            create_cvar( "yav_ban_type", "2", _, "Ban type: -2 = BANID; -1 = ADDIP; 1 = AMXBANS; 2 = FRESHBANS; 3 = ADVANCED BANS; 4 = SUPERBAN; 5 = MULTIBAN", true, -2.0, true, 5.0 )
    g_pcvr_BanReason =            create_cvar( "yav_ban_reason", "0", _, "Ban reason input method: 0 = manual + prepared; 1 = only manual; 2 = only prepared.", true, 0.0, true, 2.0 )
    g_pcvr_Delay =                create_cvar( "yav_delay", "5", _, "Delay before previous vote (in minutes) for each player.", true, 0.0 )
    g_pcvr_Duration =            create_cvar( "yav_duration", "15", _, "Duration of the vote (in seconds).", true, 5.0 )
    g_pcvr_Percent =            create_cvar( "yav_percent", "60", _, "Percent of positive votes of total players that required for ban success.", true, 1.0, true, 100.0 )
    g_pcvr_MinVotes =            create_cvar( "yav_min_votes", "2", _, "Minimal number of positive votes that required for success.", true, 2.0, true, 31.0 )
    g_pcvr_SpecAdmins =            create_cvar( "yav_spec_admins", "0", _, "Will plugin select admins in the Spectators team for Notify feature, or just skip them.", true, 0.0, true, 1.0 )
    g_pcvr_RoundStartDelay =    create_cvar( "yav_roundstart_delay", "-2", _, "Block the vote at round start: -2 = by mp_freezetime; -1 = by mp_buytime; 0 = disable; or any positive value.", true, -2.0 )
    g_pcvr_Access =                create_cvar( "yav_access", "", _, "Flags just for access to voteban feature." )
    g_pcvr_TimeAccess =            create_cvar( "yav_time_access", "c", _, "Access flags for additional ban time 'yav_time'." )
    g_pcvr_AdminAccess =        create_cvar( "yav_admin_access", "d", _, "Access flags for admins with their own ban-menu for Notify feature." )
    g_pcvr_ImmunityAccess =        create_cvar( "yav_immunity_access", "a", _, "Access flags for immunity to the vote for ban." )
    g_pcvr_LogToFile =            create_cvar( "yav_log_to_file", "1", _, "Log all successful bans to file '\\addons\amxmodx\logs\YAV_YYYYMMDD.log'.", true, 0.0, true, 1.0 )
    
    g_pcvr_mpBuyTime =            get_cvar_pointer( "mp_buytime" )
    g_pcvr_mpFreezeTime =        get_cvar_pointer( "mp_freezetime" )
    
    register_event( "HLTV", "event_newround", "a", "1=0", "2=0" )
    
    register_clcmd( "say /voteban", "show_voteban_players_menu", _, "- show players menu for voteban" )
    register_clcmd( "say_team /voteban", "show_voteban_players_menu", _, "- show players menu for voteban" )
    register_clcmd( "amx_votebanmenu", "show_voteban_main_menu", _, "- show voteban menu" )
    
    register_clcmd( "voteban_reason", "cmd_voteban_reason" )

    register_dictionary( "yet_another_voteban.txt" )
}

public plugin_cfg()
{
    new szData[ 44 ]; get_pcvar_string( g_pcvr_Time, szData, charsmax( szData ) )
    
    parse( szData,    g_szParsedCvarTime[ 0 ], 7,
                    g_szParsedCvarTime[ 1 ], 7,
                    g_szParsedCvarTime[ 2 ], 7,
                    g_szParsedCvarTime[ 3 ], 7,
                    g_szParsedCvarTime[ 4 ], 7 )
}

public event_newround()
{
    new Float:f_pCvrRSDelay
    f_pCvrRSDelay = get_pcvar_float( g_pcvr_RoundStartDelay )
    
    if( f_pCvrRSDelay == 0.0 )
    {
        g_bIsVoteBlocked = false
        return
    }

    if( task_exists( TID_BLOCKVOTE ) )
        remove_task( TID_BLOCKVOTE )
    
    if( f_pCvrRSDelay == -1.0 )
        f_pCvrRSDelay = get_pcvar_float( g_pcvr_mpBuyTime ) * 60
    else if( f_pCvrRSDelay == -2.0 )
        f_pCvrRSDelay = get_pcvar_float( g_pcvr_mpFreezeTime )
    
    g_bIsVoteBlocked = true
    set_task( f_pCvrRSDelay, "task_unblock_vote", TID_BLOCKVOTE )
}

public task_unblock_vote()
    g_bIsVoteBlocked = false
    
public client_connect( id )
    clear_user_voteban_data( id )

public client_disconnected( id )
{
    clear_user_voteban_data( id )
    
    if( ( g_iBanID == id ) && g_bIsVoteStarted )
    {
        new i
        
        for( i = 1; i <= MAX_PLAYERS; i ++ )
        {
            if( is_user_connected( i ) )
                yet_another_print_color( i, "%L", i, "VOTEBAN_PLAYER_LEFT", id ) // Игрок %n вышел, голосование отменено.
        }
        
        clear_voteban_data()
    }
}

public clear_user_voteban_data( id )
{
    g_iUserSelectedID[ id ] = 0
    g_iUserBanTime[ id ] = get_pcvar_num( g_pcvr_DefaultTime )
    arrayset( g_szUserReason[ id ], 0, sizeof( g_szUserReason ) )
}

public clear_voteban_data()
{
    if( task_exists( TID_ENDVOTE ) )
        remove_task( TID_ENDVOTE )
    
    g_bIsVoteStarted = false
    g_iBanID = 0
    g_iBanTime = 0
    arrayset( g_szBanReason, 0, sizeof( g_szBanReason ) )
    arrayset( g_iTotalVotes, 0, MAX_PLAYERS + 1 )
}

public cmd_voteban_reason( id )
{
    new i, szArgs[ 64 ], szBlock[][] = { "!g", "!y", "!t", "%", "#", "", "", "", "", ";", "\", ^"^^" }
    
    read_args( szArgs, charsmax( szArgs ) )
    remove_quotes( szArgs )
    
    for( i = 0; i < sizeof( szBlock ); i ++ )
        replace_all( szArgs, charsmax( szArgs ), szBlock[ i ], "" )
    
    g_szUserReason[ id ] = szArgs
    
    show_voteban_main_menu( id )
    
    return PLUGIN_HANDLED
}

public show_voteban_players_menu( id )
{
    if( !is_voteban_available( id ) )
        return PLUGIN_HANDLED
    
    new iMenu, i, szTemp[ 64 ], szFlags[ 24 ], szId[ 3 ]
    
    formatex( szTemp, charsmax( szTemp ), "\y%L\R", id, "VOTEBAN_MENU_PLAYERS_TITLE" ) // Выбор игрока
    iMenu = menu_create( szTemp, "handler_voteban_players_menu" )
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || ( i == id ) )
            continue
        
        get_pcvar_string( g_pcvr_ImmunityAccess, szFlags, charsmax( szFlags ) )
        
        if( get_user_flags( i ) & read_flags( szFlags ) )
            formatex( szTemp, charsmax( szTemp ), "\d%n \r*", i )
        else
            formatex( szTemp, charsmax( szTemp ), "\w%n", i )
        
        num_to_str( i, szId, charsmax( szId ) )
        
        menu_additem( iMenu, szTemp, szId, ADMIN_ALL )
    }
    
    if( !menu_items( iMenu ) )
    {
        menu_destroy( iMenu )
        return PLUGIN_HANDLED
    }
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_BACK" )
    menu_setprop( iMenu, MPROP_BACKNAME, szTemp )
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_NEXT" )
    menu_setprop( iMenu, MPROP_NEXTNAME, szTemp )
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
    
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
    
    menu_display( id, iMenu, 0 )
    
    return PLUGIN_HANDLED
}

public handler_voteban_players_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        client_send_audio( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    new szData[ 3 ], szItemName[ 32 ], iAccess, iCallback, iSelectedID
    menu_item_getinfo( iMenu, iItem, iAccess, szData, charsmax( szData ), szItemName, charsmax( szItemName ), iCallback )
    
    iSelectedID = str_to_num( szData )
    
    if( get_user_status( iSelectedID ) )
    {
        new szFlags[ 24 ]
        get_pcvar_string( g_pcvr_ImmunityAccess, szFlags, charsmax( szFlags ) )
    
        if( !( get_user_flags( iSelectedID ) & read_flags( szFlags ) ) )
        {
            g_iUserSelectedID[ id ] = iSelectedID
            show_voteban_main_menu( id )
            client_send_audio( id, MENU_SOUND_SELECT )
        }
        else
        {
            show_voteban_players_menu( id )
            yet_another_print_color( id, "%L", id, "VOTEBAN_IMMUNITY" ) // Выбранный игрок имеет иммунитет к бану.
            client_send_audio( id, MENU_SOUND_DENY )
        }
    }
    else
    {
        yet_another_print_color( id, "%L", id, "VOTEBAN_LEAVE" ) // Выбранный игрок недоступен для выбора, возможно он покинул сервер.
        client_send_audio( id, MENU_SOUND_DENY )
    }
    
    client_send_audio( id, MENU_SOUND_SELECT )

    menu_destroy( iMenu )
    
    return PLUGIN_HANDLED
}

public show_voteban_main_menu( id )
{
    if( !is_voteban_available( id ) )
        return PLUGIN_HANDLED
    
    new iMenu, szTemp[ 64 ], iSelectedID
    
    iSelectedID = g_iUserSelectedID[ id ]
    
    formatex( szTemp, charsmax( szTemp ), "\y%L", id, "VOTEBAN_MENU_TITLE" ) // Голосование за бан
    iMenu = menu_create( szTemp, "handler_voteban_main_menu" )

// === 1 ===

    if( get_user_status( iSelectedID ) )
        formatex( szTemp, charsmax( szTemp ), "%L \y%n", id, "VOTEBAN_MENU_PLAYER", iSelectedID ) // Игрок:

    else
        formatex( szTemp, charsmax( szTemp ), "%L \d%L", id, "VOTEBAN_MENU_PLAYER", id, "VOTEBAN_MENU_SELECT_PLAYER" ) // Выбрать игрока

    menu_additem( iMenu, szTemp, "1", ADMIN_ALL )
    
// =========
    

// === 2 ===

    if( g_szUserReason[ id ][ 0 ] )
        formatex( szTemp, charsmax( szTemp ), "%L \y%s^n", id, "VOTEBAN_MENU_REASON", g_szUserReason[ id ] ) // Причина
        
    else formatex( szTemp, charsmax( szTemp ), "%L \d%L^n", id, "VOTEBAN_MENU_REASON", id, "VOTEBAN_MENU_ENTER_REASON"  ) // Причина || Ввести причину бана
    
    menu_additem( iMenu, szTemp, "2", ADMIN_ALL )
    
// =========

// === 3 ===

    new szFlags[ 24 ]
    get_pcvar_string( g_pcvr_TimeAccess, szFlags, charsmax( szFlags ) )
    
    if( get_user_flags( id ) & read_flags( szFlags ) )
    {
        formatex( szTemp, charsmax( szTemp ), "%L \y%i %L^n", id, "VOTEBAN_MENU_TIME", g_iUserBanTime[ id ], id, "VOTEBAN_MENU_MINUTES" ) // Время бана || минут
        menu_additem( iMenu, szTemp, "3", ADMIN_ALL )
    }
    
// =========

// === 4 ===
    
    new iAdmins = get_admins_online()
    
    if( iAdmins )
        formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_NOTIFY", iAdmins ) // Сообщить администратору (\y%d в сети\w)
    else
        formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_START_VOTE" ) // Начать голосование
    
    menu_additem( iMenu, szTemp, "4", ADMIN_ALL )
    
// =========

    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
    
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
    
    menu_display( id, iMenu, 0 )
    
    return PLUGIN_HANDLED
}

public handler_voteban_main_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        clear_user_voteban_data( id )
        client_send_audio( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    new szData[ 3 ], szName[ 32 ], iAccess, iCallback, iKey
    menu_item_getinfo( iMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), iCallback )
    
    iKey = str_to_num( szData )
    
    switch( iKey )
    {
        case 1:
        {
            show_voteban_players_menu( id )
            client_send_audio( id, MENU_SOUND_SELECT )
        }
        
        case 2:
        {
            if( get_pcvar_num( g_pcvr_BanReason ) != 1 )
                show_voteban_reason_menu( id )
            else
            {
                client_cmd( id, "messagemode voteban_reason" )
                yet_another_print_color( id, "%L",  id, "VOTEBAN_WRITING_REASON" ) // Активирован ручной ввод причины бана.
            }
            
            client_send_audio( id, MENU_SOUND_SELECT )
        }
        
        case 3:
        {
            show_voteban_time_menu( id )
            client_send_audio( id, MENU_SOUND_SELECT )
        }
        
        case 4:
        {
            new iSelectedID = g_iUserSelectedID[ id ]
            
            if( !get_user_status( iSelectedID ) )
            {
                yet_another_print_color( id, "%L",  id, "VOTEBAN_NEED_PLAYER" ) // Вы должны выбрать игрока
                show_voteban_main_menu( id )
                client_send_audio( id, MENU_SOUND_DENY )
            }
            
            else if( !g_szUserReason[ id ][ 0 ] )
            {
                yet_another_print_color( id, "%L",  id, "VOTEBAN_NEED_REASON" ) // Вы должны ввести причину бана
                show_voteban_main_menu( id )
                client_send_audio( id, MENU_SOUND_DENY )
            }
            
            else
            {   
                new szFlags[ 24 ], iAdmins = get_admins_online()
                
                if( iAdmins )
                {
                    new i
                    
                    for( i = 1; i <= MAX_PLAYERS; i ++ )
                    {
                        get_pcvar_string( g_pcvr_AdminAccess, szFlags, charsmax( szFlags ) )
        
                        if( !get_user_status( i ) || !( get_user_flags( i ) & read_flags( szFlags ) ) )
                            continue
                            
                        yet_another_print_color( i, "%L",  i, "VOTEBAN_ADMIN_NOTIFICATION", id, iSelectedID, g_szUserReason[ id ] ) // %n хочет забанить %n за "%s".
                        client_send_audio( i, MENU_SOUND_SUCCESS )
                    }
                    
                    yet_another_print_color( id, "%L",  id, "VOTEBAN_ADMIN_NOTIFIED", iAdmins ) // Администраторов уведомлено о вашей жалобе: %d.
                    client_send_audio( id, MENU_SOUND_SUCCESS )
                    clear_user_voteban_data( id )
                    
                    return PLUGIN_HANDLED
                }
                
                get_pcvar_string( g_pcvr_TimeAccess, szFlags, charsmax( szFlags ) )
                
                get_user_name( id, g_szInitiator[ 0 ], charsmax( g_szInitiator[] ) )
                get_user_ip( id, g_szInitiator[ 1 ], charsmax( g_szInitiator[] ), 1 )
                get_user_authid( id, g_szInitiator[ 2 ], charsmax( g_szInitiator[] ) )
                
                g_iBanID = iSelectedID
                g_szBanReason = g_szUserReason[ id ]
                
                if( get_user_flags( id ) & read_flags( szFlags ) )
                    g_iBanTime = g_iUserBanTime[ id ]
                
                else g_iBanTime = get_pcvar_num( g_pcvr_DefaultTime )
                
                clear_user_voteban_data( id )
                
                g_bIsVoteStarted = true
                
                show_voteban_menu( id )
                
                g_iUserGametime[ id ] = floatround( get_gametime() )
                set_task( get_pcvar_float( g_pcvr_Duration ), "task_end_vote", TID_ENDVOTE )
            }
        }
    }
    
    menu_destroy( iMenu )
    
    return PLUGIN_HANDLED
}

public show_voteban_reason_menu( id )
{
    if( !is_voteban_available( id ) )
        return PLUGIN_HANDLED
    
    new iMenu, szTemp[ 64 ]
    
    formatex( szTemp, charsmax( szTemp ), "\y%L\R", id, "VOTEBAN_MENU_REASON_TITLE" ) // Выбор причины бана
    iMenu = menu_create( szTemp, "handler_voteban_reason_menu" )
    
    if( get_pcvar_num( g_pcvr_BanReason ) == 0 )
    {
        formatex( szTemp, charsmax( szTemp ), "%L^n", id, "VOTEBAN_MENU_ENTER_REASON" ) // Ввести причину бана...
        menu_additem( iMenu, szTemp, "0", ADMIN_ALL )
    }
    
    new i = 1

    while( i )
    {
        formatex( szTemp, charsmax( szTemp ), "%L", id, fmt( "VOTEBAN_ADD_REASON_%d", i ) ) // any
        
        if( contain( szTemp, "ML_NOTFOUND" ) != -1 )
            break
        
        if( szTemp[ 0 ] )
            menu_additem( iMenu, szTemp, szTemp, ADMIN_ALL )
        
        i ++
    }
    
    if( !menu_items( iMenu ) )
    {
        menu_destroy( iMenu )
        client_cmd( id, "messagemode voteban_reason" )
        yet_another_print_color( id, "%L",  id, "VOTEBAN_WRITING_REASON" ) // Активирован ручной ввод причины бана.
        return PLUGIN_HANDLED
    }
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_BACK" )
    menu_setprop( iMenu, MPROP_BACKNAME, szTemp )
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_NEXT" )
    menu_setprop( iMenu, MPROP_NEXTNAME, szTemp )
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
    
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
    
    menu_display( id, iMenu, 0 )
    
    return PLUGIN_HANDLED
}

public handler_voteban_reason_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        client_send_audio( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    new szData[ 16 ], szItemName[ 64 ], iAccess, iCallback
    menu_item_getinfo( iMenu, iItem, iAccess, szData, charsmax( szData ), szItemName, charsmax( szItemName ), iCallback )
    
    if( iItem == 0 && szData[ 0 ] == '0' )
    {
        client_cmd( id, "messagemode voteban_reason" )
        yet_another_print_color( id, "%L",  id, "VOTEBAN_WRITING_REASON" ) // Активирован ручной ввод причины бана.
    }
    else
    {
        g_szUserReason[ id ] = szItemName
        show_voteban_main_menu( id )
    }
    
    client_send_audio( id, MENU_SOUND_SELECT )
    
    menu_destroy( iMenu )
    
    return PLUGIN_HANDLED
}

public show_voteban_time_menu( id )
{
    new iMenu, i, szTemp[ 190 ]

    formatex( szTemp, charsmax( szTemp ), "\y%L", id, "VOTEBAN_MENU_TIME_TITLE" ) // Выбор срока бана
    iMenu = menu_create( szTemp, "handler_voteban_time_menu" )

    for( i = 0; i < sizeof( g_szParsedCvarTime ); i ++ )
    {
        if( !g_szParsedCvarTime[ i ][ 0 ] )
            break
        
        formatex( szTemp, charsmax( szTemp ), "%s %L", g_szParsedCvarTime[ i ], id, "VOTEBAN_MENU_MINUTES" ) // минут
        
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
    }
    
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
    
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
    
    menu_display( id, iMenu, 0 )
    
    return PLUGIN_HANDLED
}

public handler_voteban_time_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        clear_user_voteban_data( id )
        client_send_audio( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    switch( iItem )
    {
        case 0..4: g_iUserBanTime[ id ] = str_to_num( g_szParsedCvarTime[ iItem ] )
    }
    
    show_voteban_main_menu( id )
    client_send_audio( id, MENU_SOUND_SELECT )
    
    menu_destroy( iMenu )
    
    return PLUGIN_HANDLED
}

public show_voteban_menu( id )
{
    new i
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || i == g_iBanID )
            continue

        client_send_audio( i, MENU_SOUND_SUCCESS )
        yet_another_print_color( i, "%L", i, "VOTEBAN_WHO_START", id, g_iBanID, g_szBanReason ) //%n начал голосование за бан !g%n!n (!g%s!n)!
        
        if( i == id )
        {
            if( add_vote( id ) )
                break
            else
                continue
        }
        
        new iMenu, szTemp[ 64 ]
        
        formatex( szTemp, charsmax( szTemp ), "\y%L", i, "VOTEBAN_MENU_TITLE" ) // Голосование за бан
        iMenu = menu_create( szTemp, "handler_voteban_menu" )
        
        formatex( szTemp, charsmax( szTemp ), "%L", i, "VOTEBAN_MENU_YES" ) // \rЗабанить
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
        
        formatex( szTemp, charsmax( szTemp ), "%L^n", i, "VOTEBAN_MENU_NO" ) // Не банить
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
        
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%n", i, "VOTEBAN_MENU_PLAYER", g_iBanID ) // Игрок
        menu_addtext( iMenu, szTemp, 1 )
        
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%s^n", i, "VOTEBAN_MENU_REASON", g_szBanReason ) // Причина
        menu_addtext( iMenu, szTemp, 1 )
        
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%n", i, "VOTEBAN_MENU_INITIATOR", id ) // Инициатор
        menu_addtext( iMenu, szTemp, 1 )
        
        menu_setprop( iMenu, MPROP_EXIT, MEXIT_NEVER )
        
        menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
        
        menu_display( i, iMenu, 0 )
    }
}

public handler_voteban_menu( id, iMenu, iItem )
{
    if( iItem == 0 )
        add_vote( id )
    else
    {
        menu_destroy( iMenu )
        client_send_audio( id, MENU_SOUND_SELECT )
        
        return PLUGIN_HANDLED
    }
    
    client_send_audio( id, MENU_SOUND_SELECT )
    
    return PLUGIN_HANDLED
}

public add_vote( id )
{
    if( !get_user_status( id ) )
        return false
    
    if( !g_bIsVoteStarted )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_ALREADY_FINISHED" ) // Голосование уже закончено.
        return false
    }

    g_iTotalVotes[ g_iBanID ] ++
    
    new iTotalVotes, iNeedVotes, i_pCvrMinVotes
    iTotalVotes = g_iTotalVotes[ g_iBanID ]
    iNeedVotes = floatround( get_pcvar_float( g_pcvr_Percent ) * get_players_online() / 100 )
    i_pCvrMinVotes = get_pcvar_num( g_pcvr_MinVotes )
    
    if( iNeedVotes < i_pCvrMinVotes )
        iNeedVotes = i_pCvrMinVotes
    
    if( iTotalVotes < iNeedVotes )
    {
        new i
        
        for( i = 1; i <= MAX_PLAYERS; i ++ )
        {
            if( is_user_connected( i ) )
            {
                if( i != g_iBanID )
                    client_print( i, print_center, "%L", i, "VOTEBAN_VOTE", g_iBanID, iTotalVotes, iNeedVotes, i_pCvrMinVotes ) // За бан %n проголосовали: %d, нужно: %d, (минимум %d).
            }
        }
    }
    
    else
    {
        ban_player( g_iBanID )
        return true
    }
    
    return false
}

public ban_player( iBanID )
{
    if( task_exists( TID_ENDVOTE ) )
        remove_task( TID_ENDVOTE )
    
    if( !get_user_status( iBanID ) )
    {
        clear_voteban_data()
        return PLUGIN_HANDLED
    }
    
    new i, szIP[ 16 ], szAuthID[ 35 ], iUserID
    
    get_user_ip( iBanID, szIP, charsmax( szIP ), 1 )
    get_user_authid( iBanID, szAuthID, charsmax( szAuthID ) )
    iUserID = get_user_userid( iBanID )

    switch( get_pcvar_num( g_pcvr_BanType ) )
    {
        case -2: server_cmd( "banid %d %s kick", g_iBanTime, szAuthID ) // BAN AUTHID (STEAMID)
        case -1: server_cmd( "addip %d ^"%s^"", g_iBanTime, szIP ) // BAN IP
        case 1: server_cmd( "amx_ban %d %s ^"[%s] %s^"", g_iBanTime, szAuthID, MSGS_PREFIX, g_szBanReason ) // AMXBANS
        case 2: server_cmd( "fb_ban %d #%d ^"[%s] %s^"", g_iBanTime, iUserID, MSGS_PREFIX, g_szBanReason ) // FRESH BANS
        case 3: server_cmd( "amx_ban #%d %d ^"[%s] %s^"", iUserID, g_iBanTime, MSGS_PREFIX, g_szBanReason ) // ADVANCED BANS
        case 4: server_cmd( "amx_superban #%d %d ^"[%s] %s^"", iUserID, g_iBanTime, MSGS_PREFIX, g_szBanReason ) // SUPERBAN
        case 5: server_cmd( "amx_multiban #%d %d ^"[%s] %s^"", iUserID, g_iBanTime, MSGS_PREFIX, g_szBanReason ) // MULTIBAN
    }
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || ( i == iBanID ) )
            continue
        
        yet_another_print_color( i, "%L", i, "VOTEBAN_BANNED", iBanID ) // !g%n!n забанен через голосование!
    }
    
    if( get_pcvar_num( g_pcvr_LogToFile ) )
    {
        new y, m, d, szTemp[ 32 ]
        
        date( y, m, d )
        formatex( szTemp, charsmax( szTemp ), "YAV_%d%02d%02d.log", y, m, d )
        log_to_file( szTemp, "Player ^"%n^" banned by initiator ^"%s^" for ^"%s^" (STEAM ID %s) (IP %s)", iBanID, g_szInitiator[ 0 ], g_szBanReason, g_szInitiator[ 2 ], g_szInitiator[ 1 ] )
    }
    
    clear_voteban_data()
    
    return PLUGIN_HANDLED
}

public task_end_vote()
{
    new i
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !is_user_connected( i ) || g_iBanID == i )
            continue
            
        yet_another_print_color( i, "%L",  i, "VOTEBAN_ENDED", g_iBanID ) // Голосование за бан !g%n!n провалено.
    }
    
    clear_voteban_data()
    
    g_bIsVoteStarted = false
}

stock bool:is_voteban_available( id )
{
    if( g_bIsVoteBlocked )
    {
        new i_pCvrRSDelay = get_pcvar_num( g_pcvr_RoundStartDelay )
        
        switch( i_pCvrRSDelay )
        {
            case -2 : yet_another_print_color( id, "%L %L",  id, "VOTEBAN_BLOCKED", id, "VOTEBAN_BLOCKED_FREEZETIME" ) // Голосование за бан заблокировано // на время фризтайма.
            case -1 : yet_another_print_color( id, "%L %L",  id, "VOTEBAN_BLOCKED", id, "VOTEBAN_BLOCKED_BUYTIME" ) // Голосование за бан заблокировано // на время покупки оружия.
            case 0 : yet_another_print_color( id, "%L.",  id, "VOTEBAN_BLOCKED" ) // Голосование за бан заблокировано
            default : yet_another_print_color( id, "%L %L",  id, "VOTEBAN_BLOCKED", id, "VOTEBAN_BLOCKED_TIME", i_pCvrRSDelay ) // Голосование за бан заблокировано // на %d сек. в начале раунда.
        }
        
        return false
    }

    if( g_bIsVoteStarted )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_ALREADY_STARTED" ) // В данный момент уже идёт голосование.
        return false
    }
    
    new szFlags, szCvarsFlags[ 3 ][ 24 ]
    
    szFlags = get_user_flags( id )
    get_pcvar_string( g_pcvr_AdminAccess, szCvarsFlags[ 0 ], charsmax( szCvarsFlags ) )
    get_pcvar_string( g_pcvr_TimeAccess, szCvarsFlags[ 1 ], charsmax( szCvarsFlags ) )
    get_pcvar_string( g_pcvr_Access, szCvarsFlags[ 2 ], charsmax( szCvarsFlags ) )
    
    if( szCvarsFlags[ 2 ][ 0 ] && !( szFlags & read_flags( szCvarsFlags[ 2 ] ) ) )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_NO_ACCESS" ) // К сожалению, у вас нет доступа к голосованию за бан.
        
        return false
    }
    
    if( szFlags & read_flags( szCvarsFlags[ 0 ] ) )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_YOU_ADMIN" ) // Используйте своё бан-меню.
        
        return false
    }
    
    if( g_iUserGametime[ id ] )
    {
        new iInterim, iDelayCvar
        
        iInterim = floatround( get_gametime() ) - g_iUserGametime[ id ]
        iDelayCvar = get_pcvar_num( g_pcvr_Delay )
        
        if( szCvarsFlags[ 1 ][ 0 ] && ( szFlags & read_flags( szCvarsFlags[ 1 ] ) ) )
            return true
        
        else if( iInterim < iDelayCvar * 60 )
        {
            yet_another_print_color( id, "%L",  id, "VOTEBAN_DELAY", ( iDelayCvar - ( iInterim / 60 ) ) + 1 ) // Вы должны подождать еще %d мин. после предыдущего голосования.
        
            return false
        }
    }

    return true
}

stock get_admins_online()
{
    new i, iAdmins, iTeam
    
    iAdmins = 0
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        new szFlags[ 24 ]; get_pcvar_string( g_pcvr_AdminAccess, szFlags, charsmax( szFlags ) )
        
        if( !get_user_status( i ) )
            continue
        
        if( !( get_user_flags( i ) & read_flags( szFlags ) ) )
            continue
        
        if( get_pcvar_num( g_pcvr_SpecAdmins ) )       
            iAdmins ++
        else
        {
            iTeam = get_user_team( i )
            
            if( !( ( iTeam == 2 ) || ( iTeam == 1 ) ) )
                continue
                
            iAdmins ++
        }
    }
    
    return iAdmins
}

stock get_players_online()
{
    new i, iPlayers
    
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) )
            continue

        iPlayers ++
    }
    
    return iPlayers
}
    
stock get_user_status( id )
{
#if defined DEBUG
    if( !is_user_connected( id ) || is_user_hltv( id ) /*|| is_user_bot( id )*/ )
#else
    if( !is_user_connected( id ) || is_user_hltv( id ) || is_user_bot( id ) )   
#endif
        return 0
    
    return 1
}
    
stock yet_another_print_color( id, szInput[], any:... )
{
    new szMessage[ 192 ]

    vformat( szMessage, charsmax( szMessage ), szInput, 3 )
    format( szMessage, charsmax( szMessage ), "^1[^4%s^1] %s", MSGS_PREFIX, szMessage )
    
    replace_all( szMessage, charsmax( szMessage ), "!g", "^4" ) // Green Color
    replace_all( szMessage, charsmax( szMessage ), "!n", "^1" ) // Default Color
    replace_all( szMessage, charsmax( szMessage ), "!t", "^3" ) // Team Color

    client_print_color( id, print_team_default, szMessage )
    
#if defined DEBUG
    client_print( 0, print_chat, "[ID%d]: %s", id, szMessage )
#endif
    
    return 1
}

// SendAudio
stock client_send_audio( id, iSoundID, iPitch = PITCH_NORM )
{
    static msgSendAudio = 0

    if( !msgSendAudio )
    {
        msgSendAudio = get_user_msgid("SendAudio");
    }

    message_begin( id ? MSG_ONE : MSG_ALL, msgSendAudio, _, id )
    write_byte( id )
    write_string( g_szMenuSounds[ iSoundID ])
    write_short( iPitch )
    message_end();
}
 

perfectblood0

Команда форума
Администратор
Регистрация
29 Окт 2017
Сообщения
2.578
Симпатии
914
Пол
Женский
Код:
/*
    Yet Another Voteban AMXX Plugin
        — удобный и симпатичный голосовальщик за бан игроков, для Ваших великолепных серверов Counter-Strike 1.6.
   
    Версия: 1.8
   

     Авторы: AndrewZ и voed.
   
   
    Команды:
   
    say /voteban
        — Меню с выбором игроков для голосования.
   
    say_team /voteban
        — Меню с выбором игроков для голосования.
       
    amx_votebanmenu
        — Главное меню голосования.
       

    Переменные:

    yav_time_default <time in minutes>
        — Стандартное время бана в минутах, доступное игрокам.
        — По умолчанию: "20"
   
    yav_time <time in minutes, up to five values>
        — Дополнительное время бана в минутах для игроков с флагом доступа "yav_time_access".
        — От 1 до 5 значений через пробел.
        — По умолчанию: "5 15 30 60 180"

    yav_ban_type <-2|-1|1|2|3|4|5>
        — Тип бана:
        — "-2"    — BANID (STEAMID);
        — "-1"    — ADDIP;
        — "1"    — AMXBANS;
        — "2"    — FRESHBANS;
        — "3"    — ADVANCED BANS;
        — "4"    — SUPERBAN;
        — "5"    — MULTIBAN.
        — По умолчанию: "2"

    yav_ban_reason <0|1|2>
        — Выбор причны бана.
            — Причины добавляются в файл \\data\lang\yet_another_voteban.txt для каждого из языков в неограниченном количестве.
            — Если лень переводить, то можете добавлять только для одного основного языка — это на ваше усмотрение. Но в таком случае удалите ключи причин у остальных языков, чтобы не конфликтовали.
            — Обязательно нумеруйте названия ключей, т.е  VOTEBAN_ADD_REASON_1,  VOTEBAN_ADD_REASON_2 и т.д...
            — Пример: VOTEBAN_ADD_REASON_1 = Читы.
        — "0" = ручной ввод + заранее подготовленные причины;
        — "1" = только ручной ввод;
        — "2" = только заранее подготовленные причины.
        — По умолчанию: "2"

    yav_delay <time in minutes>
        — Задержка между голосованиями для каждого игрока отдельно.
        — По умолчанию: "5"

    yav_duration <time in seconds>
        — Длительность голосования в секундах.
        — По умолчанию: "15"

    yav_percent <percent>
        — Необходимый процент проголосовавших игроков для осуществления бана.
        — По умолчанию: "60"

    yav_min_votes <number>
        — Необходимый минимум голосов за бан для того, чтобы голосование вообще могло состояться.
        — Минимальное значение: "2"
        — По умолчанию: "2"

    yav_spec_admins <1|0>
        — Учитывать ли админов в команде наблюдателей как активных при подборе для оповещения, при установленном значении "yav_admin_access".
        — "1" = учитывать;
        — "0" = пропускать.
        — По умолчанию: "0"

    yav_roundstart_delay <-2|-1|time in seconds>
        — Блокировка вызова голосования в начале раунда, в секундах. Например, чтобы не сбивать меню покупки игрокам.
        — Укажите положительное дробное или целое значение для блокировки на указанное время, либо:
        — "-1" = блокировка до конца mp_buytime;
        — "-2" = блокировка до конца mp_freezetime;
        — "0" = отключить, не блокировать.
        — По умолчанию: "-2"
   
    При указани флагов можно назначить несколько: "abc", либо оставить пустым "", чтобы отключить функцию/разрешить использовать всем:

    yav_access <flags>
        — Флаг(и) доступа к меню голосования.
        — По умолчанию: ""

    yav_time_access <flags>
        — Флаг(и) доступа к выбору времени бана "yav_time" и к голосованию без задржки "yav_delay".
        — По умолчанию: "с"

    yav_admin_access <flags>
        — Флаг(и) админа для блока голосования и включения оповещения админов.
        — По умолчанию: "d"
       
    yav_immunity_access <flags>
        — Флаг(и) иммунитета к вотебану.
        — По умолчанию: "a"
       
    yav_log_to_file <0|1>
        — Логирование банов в файл (\\addons\amxmodx\logs\YAV_ГГГГММДД.log).
        — "0" = выкл;
        — "1" = вкл.
        — По умолчанию: "1"
*/

//#define DEBUG

#include <amxmodx>

#define PLUGIN        "Yet Another Voteban"
#define VERSION        "1.8"
#define AUTHOR        "AndrewZ/voed"

#define MSGS_PREFIX        "YAV"

#define TID_ENDVOTE        5051
#define TID_BLOCKVOTE    5052

enum
{
    MENU_SOUND_SELECT, // 0
    MENU_SOUND_DENY, // 1
    MENU_SOUND_SUCCESS // 2
}

new g_pcvr_DefaultTime,        g_pcvr_Time,            g_pcvr_BanType,        g_pcvr_BanReason,    g_pcvr_Delay,
    g_pcvr_Duration,        g_pcvr_Percent,            g_pcvr_MinVotes,    g_pcvr_SpecAdmins,    g_pcvr_RoundStartDelay,
    g_pcvr_mpBuyTime,        g_pcvr_mpFreezeTime,    g_pcvr_Access,        g_pcvr_TimeAccess,    g_pcvr_AdminAccess,
    g_pcvr_ImmunityAccess,    g_pcvr_LogToFile

new g_szMenuSounds[][] =
{
    "buttons/lightswitch2.wav", // 0
    "buttons/button2.wav", // 1
    "buttons/blip1.wav" // 2
}

new g_szUserReason[ MAX_PLAYERS + 1 ][ 64 ],
    g_iUserSelectedID[ MAX_PLAYERS + 1 ],
    g_iUserBanTime[ MAX_PLAYERS + 1 ],
    g_iTotalVotes[ MAX_PLAYERS + 1 ],
    g_iUserGametime[ MAX_PLAYERS + 1 ]

new g_szInitiator[ 3 ][ 35 ],
    g_iBanID,
    g_iBanTime,
    g_szBanReason[ 64 ]
   
new bool:g_bIsVoteStarted, bool:g_bIsVoteBlocked
new g_szParsedCvarTime[ 5 ][ 8 ]

public plugin_precache()
{
    new i
   
    for( i = 0; i < sizeof g_szMenuSounds; i ++ )
        precache_sound( g_szMenuSounds[ i ] )
}

public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )
   
    set_pcvar_string( register_cvar( "yav_version", VERSION, FCVAR_SPONLY | FCVAR_SERVER ), VERSION )

    g_pcvr_DefaultTime =        create_cvar( "yav_time_default", "5", _, "Default ban time for all non-privileged players." )
    g_pcvr_Time =                create_cvar( "yav_time", "5 15 30 60 180", _, "From 1 to 5 additional ban times for 'yav_time_access' cvar." )
    g_pcvr_BanType =            create_cvar( "yav_ban_type", "2", _, "Ban type: -2 = BANID; -1 = ADDIP; 1 = AMXBANS; 2 = FRESHBANS; 3 = ADVANCED BANS; 4 = SUPERBAN; 5 = MULTIBAN", true, -2.0, true, 5.0 )
    g_pcvr_BanReason =            create_cvar( "yav_ban_reason", "0", _, "Ban reason input method: 0 = manual + prepared; 1 = only manual; 2 = only prepared.", true, 0.0, true, 2.0 )
    g_pcvr_Delay =                create_cvar( "yav_delay", "5", _, "Delay before previous vote (in minutes) for each player.", true, 0.0 )
    g_pcvr_Duration =            create_cvar( "yav_duration", "15", _, "Duration of the vote (in seconds).", true, 5.0 )
    g_pcvr_Percent =            create_cvar( "yav_percent", "60", _, "Percent of positive votes of total players that required for ban success.", true, 1.0, true, 100.0 )
    g_pcvr_MinVotes =            create_cvar( "yav_min_votes", "2", _, "Minimal number of positive votes that required for success.", true, 2.0, true, 31.0 )
    g_pcvr_SpecAdmins =            create_cvar( "yav_spec_admins", "0", _, "Will plugin select admins in the Spectators team for Notify feature, or just skip them.", true, 0.0, true, 1.0 )
    g_pcvr_RoundStartDelay =    create_cvar( "yav_roundstart_delay", "-2", _, "Block the vote at round start: -2 = by mp_freezetime; -1 = by mp_buytime; 0 = disable; or any positive value.", true, -2.0 )
    g_pcvr_Access =                create_cvar( "yav_access", "", _, "Flags just for access to voteban feature." )
    g_pcvr_TimeAccess =            create_cvar( "yav_time_access", "c", _, "Access flags for additional ban time 'yav_time'." )
    g_pcvr_AdminAccess =        create_cvar( "yav_admin_access", "d", _, "Access flags for admins with their own ban-menu for Notify feature." )
    g_pcvr_ImmunityAccess =        create_cvar( "yav_immunity_access", "a", _, "Access flags for immunity to the vote for ban." )
    g_pcvr_LogToFile =            create_cvar( "yav_log_to_file", "1", _, "Log all successful bans to file '\\addons\amxmodx\logs\YAV_YYYYMMDD.log'.", true, 0.0, true, 1.0 )
   
    g_pcvr_mpBuyTime =            get_cvar_pointer( "mp_buytime" )
    g_pcvr_mpFreezeTime =        get_cvar_pointer( "mp_freezetime" )
   
    register_event( "HLTV", "event_newround", "a", "1=0", "2=0" )
   
    register_clcmd( "say /voteban", "show_voteban_players_menu", _, "- show players menu for voteban" )
    register_clcmd( "say_team /voteban", "show_voteban_players_menu", _, "- show players menu for voteban" )
    register_clcmd( "amx_votebanmenu", "show_voteban_main_menu", _, "- show voteban menu" )
   
    register_clcmd( "voteban_reason", "cmd_voteban_reason" )

    register_dictionary( "yet_another_voteban.txt" )
}

public plugin_cfg()
{
    new szData[ 44 ]; get_pcvar_string( g_pcvr_Time, szData, charsmax( szData ) )
   
    parse( szData,    g_szParsedCvarTime[ 0 ], 7,
                    g_szParsedCvarTime[ 1 ], 7,
                    g_szParsedCvarTime[ 2 ], 7,
                    g_szParsedCvarTime[ 3 ], 7,
                    g_szParsedCvarTime[ 4 ], 7 )
}

public event_newround()
{
    new Float:f_pCvrRSDelay
    f_pCvrRSDelay = get_pcvar_float( g_pcvr_RoundStartDelay )
   
    if( f_pCvrRSDelay == 0.0 )
    {
        g_bIsVoteBlocked = false
        return
    }

    if( task_exists( TID_BLOCKVOTE ) )
        remove_task( TID_BLOCKVOTE )
   
    if( f_pCvrRSDelay == -1.0 )
        f_pCvrRSDelay = get_pcvar_float( g_pcvr_mpBuyTime ) * 60
    else if( f_pCvrRSDelay == -2.0 )
        f_pCvrRSDelay = get_pcvar_float( g_pcvr_mpFreezeTime )
   
    g_bIsVoteBlocked = true
    set_task( f_pCvrRSDelay, "task_unblock_vote", TID_BLOCKVOTE )
}

public task_unblock_vote()
    g_bIsVoteBlocked = false
   
public client_connect( id )
    clear_user_voteban_data( id )

public client_disconnected( id )
{
    clear_user_voteban_data( id )
   
    if( ( g_iBanID == id ) && g_bIsVoteStarted )
    {
        new i
       
        for( i = 1; i <= MAX_PLAYERS; i ++ )
        {
            if( is_user_connected( i ) )
                yet_another_print_color( i, "%L", i, "VOTEBAN_PLAYER_LEFT", id ) // Игрок %n вышел, голосование отменено.
        }
       
        clear_voteban_data()
    }
}

public clear_user_voteban_data( id )
{
    g_iUserSelectedID[ id ] = 0
    g_iUserBanTime[ id ] = get_pcvar_num( g_pcvr_DefaultTime )
    arrayset( g_szUserReason[ id ], 0, sizeof( g_szUserReason ) )
}

public clear_voteban_data()
{
    if( task_exists( TID_ENDVOTE ) )
        remove_task( TID_ENDVOTE )
   
    g_bIsVoteStarted = false
    g_iBanID = 0
    g_iBanTime = 0
    arrayset( g_szBanReason, 0, sizeof( g_szBanReason ) )
    arrayset( g_iTotalVotes, 0, MAX_PLAYERS + 1 )
}

public cmd_voteban_reason( id )
{
    new i, szArgs[ 64 ], szBlock[][] = { "!g", "!y", "!t", "%", "#", "", "", "", "", ";", "\", ^"^^" }
   
    read_args( szArgs, charsmax( szArgs ) )
    remove_quotes( szArgs )
   
    for( i = 0; i < sizeof( szBlock ); i ++ )
        replace_all( szArgs, charsmax( szArgs ), szBlock[ i ], "" )
   
    g_szUserReason[ id ] = szArgs
   
    show_voteban_main_menu( id )
   
    return PLUGIN_HANDLED
}

public show_voteban_players_menu( id )
{
    if( !is_voteban_available( id ) )
        return PLUGIN_HANDLED
   
    new iMenu, i, szTemp[ 64 ], szFlags[ 24 ], szId[ 3 ]
   
    formatex( szTemp, charsmax( szTemp ), "\y%L\R", id, "VOTEBAN_MENU_PLAYERS_TITLE" ) // Выбор игрока
    iMenu = menu_create( szTemp, "handler_voteban_players_menu" )
   
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || ( i == id ) )
            continue
       
        get_pcvar_string( g_pcvr_ImmunityAccess, szFlags, charsmax( szFlags ) )
       
        if( get_user_flags( i ) & read_flags( szFlags ) )
            formatex( szTemp, charsmax( szTemp ), "\d%n \r*", i )
        else
            formatex( szTemp, charsmax( szTemp ), "\w%n", i )
       
        num_to_str( i, szId, charsmax( szId ) )
       
        menu_additem( iMenu, szTemp, szId, ADMIN_ALL )
    }
   
    if( !menu_items( iMenu ) )
    {
        menu_destroy( iMenu )
        return PLUGIN_HANDLED
    }
   
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_BACK" )
    menu_setprop( iMenu, MPROP_BACKNAME, szTemp )
   
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_NEXT" )
    menu_setprop( iMenu, MPROP_NEXTNAME, szTemp )
   
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
   
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
   
    menu_display( id, iMenu, 0 )
   
    return PLUGIN_HANDLED
}

public handler_voteban_players_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        client_send_audio( id, MENU_SOUND_SELECT )
       
        return PLUGIN_HANDLED
    }
   
    new szData[ 3 ], szItemName[ 32 ], iAccess, iCallback, iSelectedID
    menu_item_getinfo( iMenu, iItem, iAccess, szData, charsmax( szData ), szItemName, charsmax( szItemName ), iCallback )
   
    iSelectedID = str_to_num( szData )
   
    if( get_user_status( iSelectedID ) )
    {
        new szFlags[ 24 ]
        get_pcvar_string( g_pcvr_ImmunityAccess, szFlags, charsmax( szFlags ) )
   
        if( !( get_user_flags( iSelectedID ) & read_flags( szFlags ) ) )
        {
            g_iUserSelectedID[ id ] = iSelectedID
            show_voteban_main_menu( id )
            client_send_audio( id, MENU_SOUND_SELECT )
        }
        else
        {
            show_voteban_players_menu( id )
            yet_another_print_color( id, "%L", id, "VOTEBAN_IMMUNITY" ) // Выбранный игрок имеет иммунитет к бану.
            client_send_audio( id, MENU_SOUND_DENY )
        }
    }
    else
    {
        yet_another_print_color( id, "%L", id, "VOTEBAN_LEAVE" ) // Выбранный игрок недоступен для выбора, возможно он покинул сервер.
        client_send_audio( id, MENU_SOUND_DENY )
    }
   
    client_send_audio( id, MENU_SOUND_SELECT )

    menu_destroy( iMenu )
   
    return PLUGIN_HANDLED
}

public show_voteban_main_menu( id )
{
    if( !is_voteban_available( id ) )
        return PLUGIN_HANDLED
   
    new iMenu, szTemp[ 64 ], iSelectedID
   
    iSelectedID = g_iUserSelectedID[ id ]
   
    formatex( szTemp, charsmax( szTemp ), "\y%L", id, "VOTEBAN_MENU_TITLE" ) // Голосование за бан
    iMenu = menu_create( szTemp, "handler_voteban_main_menu" )

// === 1 ===

    if( get_user_status( iSelectedID ) )
        formatex( szTemp, charsmax( szTemp ), "%L \y%n", id, "VOTEBAN_MENU_PLAYER", iSelectedID ) // Игрок:

    else
        formatex( szTemp, charsmax( szTemp ), "%L \d%L", id, "VOTEBAN_MENU_PLAYER", id, "VOTEBAN_MENU_SELECT_PLAYER" ) // Выбрать игрока

    menu_additem( iMenu, szTemp, "1", ADMIN_ALL )
   
// =========
   

// === 2 ===

    if( g_szUserReason[ id ][ 0 ] )
        formatex( szTemp, charsmax( szTemp ), "%L \y%s^n", id, "VOTEBAN_MENU_REASON", g_szUserReason[ id ] ) // Причина
       
    else formatex( szTemp, charsmax( szTemp ), "%L \d%L^n", id, "VOTEBAN_MENU_REASON", id, "VOTEBAN_MENU_ENTER_REASON"  ) // Причина || Ввести причину бана
   
    menu_additem( iMenu, szTemp, "2", ADMIN_ALL )
   
// =========

// === 3 ===

    new szFlags[ 24 ]
    get_pcvar_string( g_pcvr_TimeAccess, szFlags, charsmax( szFlags ) )
   
    if( get_user_flags( id ) & read_flags( szFlags ) )
    {
        formatex( szTemp, charsmax( szTemp ), "%L \y%i %L^n", id, "VOTEBAN_MENU_TIME", g_iUserBanTime[ id ], id, "VOTEBAN_MENU_MINUTES" ) // Время бана || минут
        menu_additem( iMenu, szTemp, "3", ADMIN_ALL )
    }
   
// =========

// === 4 ===
   
    new iAdmins = get_admins_online()
   
    if( iAdmins )
        formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_NOTIFY", iAdmins ) // Сообщить администратору (\y%d в сети\w)
    else
        formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_START_VOTE" ) // Начать голосование
   
    menu_additem( iMenu, szTemp, "4", ADMIN_ALL )
   
// =========

   
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
   
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
   
    menu_display( id, iMenu, 0 )
   
    return PLUGIN_HANDLED
}

public handler_voteban_main_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        clear_user_voteban_data( id )
        client_send_audio( id, MENU_SOUND_SELECT )
       
        return PLUGIN_HANDLED
    }
   
    new szData[ 3 ], szName[ 32 ], iAccess, iCallback, iKey
    menu_item_getinfo( iMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), iCallback )
   
    iKey = str_to_num( szData )
   
    switch( iKey )
    {
        case 1:
        {
            show_voteban_players_menu( id )
            client_send_audio( id, MENU_SOUND_SELECT )
        }
       
        case 2:
        {
            if( get_pcvar_num( g_pcvr_BanReason ) != 1 )
                show_voteban_reason_menu( id )
            else
            {
                client_cmd( id, "messagemode voteban_reason" )
                yet_another_print_color( id, "%L",  id, "VOTEBAN_WRITING_REASON" ) // Активирован ручной ввод причины бана.
            }
           
            client_send_audio( id, MENU_SOUND_SELECT )
        }
       
        case 3:
        {
            show_voteban_time_menu( id )
            client_send_audio( id, MENU_SOUND_SELECT )
        }
       
        case 4:
        {
            new iSelectedID = g_iUserSelectedID[ id ]
           
            if( !get_user_status( iSelectedID ) )
            {
                yet_another_print_color( id, "%L",  id, "VOTEBAN_NEED_PLAYER" ) // Вы должны выбрать игрока
                show_voteban_main_menu( id )
                client_send_audio( id, MENU_SOUND_DENY )
            }
           
            else if( !g_szUserReason[ id ][ 0 ] )
            {
                yet_another_print_color( id, "%L",  id, "VOTEBAN_NEED_REASON" ) // Вы должны ввести причину бана
                show_voteban_main_menu( id )
                client_send_audio( id, MENU_SOUND_DENY )
            }
           
            else
            {  
                new szFlags[ 24 ], iAdmins = get_admins_online()
               
                if( iAdmins )
                {
                    new i
                   
                    for( i = 1; i <= MAX_PLAYERS; i ++ )
                    {
                        get_pcvar_string( g_pcvr_AdminAccess, szFlags, charsmax( szFlags ) )
       
                        if( !get_user_status( i ) || !( get_user_flags( i ) & read_flags( szFlags ) ) )
                            continue
                           
                        yet_another_print_color( i, "%L",  i, "VOTEBAN_ADMIN_NOTIFICATION", id, iSelectedID, g_szUserReason[ id ] ) // %n хочет забанить %n за "%s".
                        client_send_audio( i, MENU_SOUND_SUCCESS )
                    }
                   
                    yet_another_print_color( id, "%L",  id, "VOTEBAN_ADMIN_NOTIFIED", iAdmins ) // Администраторов уведомлено о вашей жалобе: %d.
                    client_send_audio( id, MENU_SOUND_SUCCESS )
                    clear_user_voteban_data( id )
                   
                    return PLUGIN_HANDLED
                }
               
                get_pcvar_string( g_pcvr_TimeAccess, szFlags, charsmax( szFlags ) )
               
                get_user_name( id, g_szInitiator[ 0 ], charsmax( g_szInitiator[] ) )
                get_user_ip( id, g_szInitiator[ 1 ], charsmax( g_szInitiator[] ), 1 )
                get_user_authid( id, g_szInitiator[ 2 ], charsmax( g_szInitiator[] ) )
               
                g_iBanID = iSelectedID
                g_szBanReason = g_szUserReason[ id ]
               
                if( get_user_flags( id ) & read_flags( szFlags ) )
                    g_iBanTime = g_iUserBanTime[ id ]
               
                else g_iBanTime = get_pcvar_num( g_pcvr_DefaultTime )
               
                clear_user_voteban_data( id )
               
                g_bIsVoteStarted = true
               
                show_voteban_menu( id )
               
                g_iUserGametime[ id ] = floatround( get_gametime() )
                set_task( get_pcvar_float( g_pcvr_Duration ), "task_end_vote", TID_ENDVOTE )
            }
        }
    }
   
    menu_destroy( iMenu )
   
    return PLUGIN_HANDLED
}

public show_voteban_reason_menu( id )
{
    if( !is_voteban_available( id ) )
        return PLUGIN_HANDLED
   
    new iMenu, szTemp[ 64 ]
   
    formatex( szTemp, charsmax( szTemp ), "\y%L\R", id, "VOTEBAN_MENU_REASON_TITLE" ) // Выбор причины бана
    iMenu = menu_create( szTemp, "handler_voteban_reason_menu" )
   
    if( get_pcvar_num( g_pcvr_BanReason ) == 0 )
    {
        formatex( szTemp, charsmax( szTemp ), "%L^n", id, "VOTEBAN_MENU_ENTER_REASON" ) // Ввести причину бана...
        menu_additem( iMenu, szTemp, "0", ADMIN_ALL )
    }
   
    new i = 1

    while( i )
    {
        formatex( szTemp, charsmax( szTemp ), "%L", id, fmt( "VOTEBAN_ADD_REASON_%d", i ) ) // any
       
        if( contain( szTemp, "ML_NOTFOUND" ) != -1 )
            break
       
        if( szTemp[ 0 ] )
            menu_additem( iMenu, szTemp, szTemp, ADMIN_ALL )
       
        i ++
    }
   
    if( !menu_items( iMenu ) )
    {
        menu_destroy( iMenu )
        client_cmd( id, "messagemode voteban_reason" )
        yet_another_print_color( id, "%L",  id, "VOTEBAN_WRITING_REASON" ) // Активирован ручной ввод причины бана.
        return PLUGIN_HANDLED
    }
   
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_BACK" )
    menu_setprop( iMenu, MPROP_BACKNAME, szTemp )
   
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_NEXT" )
    menu_setprop( iMenu, MPROP_NEXTNAME, szTemp )
   
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
   
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
   
    menu_display( id, iMenu, 0 )
   
    return PLUGIN_HANDLED
}

public handler_voteban_reason_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        client_send_audio( id, MENU_SOUND_SELECT )
       
        return PLUGIN_HANDLED
    }
   
    new szData[ 16 ], szItemName[ 64 ], iAccess, iCallback
    menu_item_getinfo( iMenu, iItem, iAccess, szData, charsmax( szData ), szItemName, charsmax( szItemName ), iCallback )
   
    if( iItem == 0 && szData[ 0 ] == '0' )
    {
        client_cmd( id, "messagemode voteban_reason" )
        yet_another_print_color( id, "%L",  id, "VOTEBAN_WRITING_REASON" ) // Активирован ручной ввод причины бана.
    }
    else
    {
        g_szUserReason[ id ] = szItemName
        show_voteban_main_menu( id )
    }
   
    client_send_audio( id, MENU_SOUND_SELECT )
   
    menu_destroy( iMenu )
   
    return PLUGIN_HANDLED
}

public show_voteban_time_menu( id )
{
    new iMenu, i, szTemp[ 190 ]

    formatex( szTemp, charsmax( szTemp ), "\y%L", id, "VOTEBAN_MENU_TIME_TITLE" ) // Выбор срока бана
    iMenu = menu_create( szTemp, "handler_voteban_time_menu" )

    for( i = 0; i < sizeof( g_szParsedCvarTime ); i ++ )
    {
        if( !g_szParsedCvarTime[ i ][ 0 ] )
            break
       
        formatex( szTemp, charsmax( szTemp ), "%s %L", g_szParsedCvarTime[ i ], id, "VOTEBAN_MENU_MINUTES" ) // минут
       
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
    }
   
    formatex( szTemp, charsmax( szTemp ), "%L", id, "VOTEBAN_MENU_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTemp )
   
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
   
    menu_display( id, iMenu, 0 )
   
    return PLUGIN_HANDLED
}

public handler_voteban_time_menu( id, iMenu, iItem )
{
    if( !is_voteban_available( id ) || ( iItem == MENU_EXIT ) )
    {
        menu_destroy( iMenu )
        clear_user_voteban_data( id )
        client_send_audio( id, MENU_SOUND_SELECT )
       
        return PLUGIN_HANDLED
    }
   
    switch( iItem )
    {
        case 0..4: g_iUserBanTime[ id ] = str_to_num( g_szParsedCvarTime[ iItem ] )
    }
   
    show_voteban_main_menu( id )
    client_send_audio( id, MENU_SOUND_SELECT )
   
    menu_destroy( iMenu )
   
    return PLUGIN_HANDLED
}

public show_voteban_menu( id )
{
    new i
   
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || i == g_iBanID )
            continue

        client_send_audio( i, MENU_SOUND_SUCCESS )
        yet_another_print_color( i, "%L", i, "VOTEBAN_WHO_START", id, g_iBanID, g_szBanReason ) //%n начал голосование за бан !g%n!n (!g%s!n)!
       
        if( i == id )
        {
            if( add_vote( id ) )
                break
            else
                continue
        }
       
        new iMenu, szTemp[ 64 ]
       
        formatex( szTemp, charsmax( szTemp ), "\y%L", i, "VOTEBAN_MENU_TITLE" ) // Голосование за бан
        iMenu = menu_create( szTemp, "handler_voteban_menu" )
       
        formatex( szTemp, charsmax( szTemp ), "%L", i, "VOTEBAN_MENU_YES" ) // \rЗабанить
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
       
        formatex( szTemp, charsmax( szTemp ), "%L^n", i, "VOTEBAN_MENU_NO" ) // Не банить
        menu_additem( iMenu, szTemp, "", ADMIN_ALL )
       
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%n", i, "VOTEBAN_MENU_PLAYER", g_iBanID ) // Игрок
        menu_addtext( iMenu, szTemp, 1 )
       
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%s^n", i, "VOTEBAN_MENU_REASON", g_szBanReason ) // Причина
        menu_addtext( iMenu, szTemp, 1 )
       
        formatex( szTemp, charsmax( szTemp ), "\w%L \y%n", i, "VOTEBAN_MENU_INITIATOR", id ) // Инициатор
        menu_addtext( iMenu, szTemp, 1 )
       
        menu_setprop( iMenu, MPROP_EXIT, MEXIT_NEVER )
       
        menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\w" )
       
        menu_display( i, iMenu, 0 )
    }
}

public handler_voteban_menu( id, iMenu, iItem )
{
    if( iItem == 0 )
        add_vote( id )
    else
    {
        menu_destroy( iMenu )
        client_send_audio( id, MENU_SOUND_SELECT )
       
        return PLUGIN_HANDLED
    }
   
    client_send_audio( id, MENU_SOUND_SELECT )
   
    return PLUGIN_HANDLED
}

public add_vote( id )
{
    if( !get_user_status( id ) )
        return false
   
    if( !g_bIsVoteStarted )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_ALREADY_FINISHED" ) // Голосование уже закончено.
        return false
    }

    g_iTotalVotes[ g_iBanID ] ++
   
    new iTotalVotes, iNeedVotes, i_pCvrMinVotes
    iTotalVotes = g_iTotalVotes[ g_iBanID ]
    iNeedVotes = floatround( get_pcvar_float( g_pcvr_Percent ) * get_players_online() / 100 )
    i_pCvrMinVotes = get_pcvar_num( g_pcvr_MinVotes )
   
    if( iNeedVotes < i_pCvrMinVotes )
        iNeedVotes = i_pCvrMinVotes
   
    if( iTotalVotes < iNeedVotes )
    {
        new i
       
        for( i = 1; i <= MAX_PLAYERS; i ++ )
        {
            if( is_user_connected( i ) )
            {
                if( i != g_iBanID )
                    client_print( i, print_center, "%L", i, "VOTEBAN_VOTE", g_iBanID, iTotalVotes, iNeedVotes, i_pCvrMinVotes ) // За бан %n проголосовали: %d, нужно: %d, (минимум %d).
            }
        }
    }
   
    else
    {
        ban_player( g_iBanID )
        return true
    }
   
    return false
}

public ban_player( iBanID )
{
    if( task_exists( TID_ENDVOTE ) )
        remove_task( TID_ENDVOTE )
   
    if( !get_user_status( iBanID ) )
    {
        clear_voteban_data()
        return PLUGIN_HANDLED
    }
   
    new i, szIP[ 16 ], szAuthID[ 35 ], iUserID
   
    get_user_ip( iBanID, szIP, charsmax( szIP ), 1 )
    get_user_authid( iBanID, szAuthID, charsmax( szAuthID ) )
    iUserID = get_user_userid( iBanID )

    switch( get_pcvar_num( g_pcvr_BanType ) )
    {
        case -2: server_cmd( "banid %d %s kick", g_iBanTime, szAuthID ) // BAN AUTHID (STEAMID)
        case -1: server_cmd( "addip %d ^"%s^"", g_iBanTime, szIP ) // BAN IP
        case 1: server_cmd( "amx_ban %d %s ^"[%s] %s^"", g_iBanTime, szAuthID, MSGS_PREFIX, g_szBanReason ) // AMXBANS
        case 2: server_cmd( "fb_ban %d #%d ^"[%s] %s^"", g_iBanTime, iUserID, MSGS_PREFIX, g_szBanReason ) // FRESH BANS
        case 3: server_cmd( "amx_ban #%d %d ^"[%s] %s^"", iUserID, g_iBanTime, MSGS_PREFIX, g_szBanReason ) // ADVANCED BANS
        case 4: server_cmd( "amx_superban #%d %d ^"[%s] %s^"", iUserID, g_iBanTime, MSGS_PREFIX, g_szBanReason ) // SUPERBAN
        case 5: server_cmd( "amx_multiban #%d %d ^"[%s] %s^"", iUserID, g_iBanTime, MSGS_PREFIX, g_szBanReason ) // MULTIBAN
    }
   
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) || ( i == iBanID ) )
            continue
       
        yet_another_print_color( i, "%L", i, "VOTEBAN_BANNED", iBanID ) // !g%n!n забанен через голосование!
    }
   
    if( get_pcvar_num( g_pcvr_LogToFile ) )
    {
        new y, m, d, szTemp[ 32 ]
       
        date( y, m, d )
        formatex( szTemp, charsmax( szTemp ), "YAV_%d%02d%02d.log", y, m, d )
        log_to_file( szTemp, "Player ^"%n^" banned by initiator ^"%s^" for ^"%s^" (STEAM ID %s) (IP %s)", iBanID, g_szInitiator[ 0 ], g_szBanReason, g_szInitiator[ 2 ], g_szInitiator[ 1 ] )
    }
   
    clear_voteban_data()
   
    return PLUGIN_HANDLED
}

public task_end_vote()
{
    new i
   
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !is_user_connected( i ) || g_iBanID == i )
            continue
           
        yet_another_print_color( i, "%L",  i, "VOTEBAN_ENDED", g_iBanID ) // Голосование за бан !g%n!n провалено.
    }
   
    clear_voteban_data()
   
    g_bIsVoteStarted = false
}

stock bool:is_voteban_available( id )
{
    if( g_bIsVoteBlocked )
    {
        new i_pCvrRSDelay = get_pcvar_num( g_pcvr_RoundStartDelay )
       
        switch( i_pCvrRSDelay )
        {
            case -2 : yet_another_print_color( id, "%L %L",  id, "VOTEBAN_BLOCKED", id, "VOTEBAN_BLOCKED_FREEZETIME" ) // Голосование за бан заблокировано // на время фризтайма.
            case -1 : yet_another_print_color( id, "%L %L",  id, "VOTEBAN_BLOCKED", id, "VOTEBAN_BLOCKED_BUYTIME" ) // Голосование за бан заблокировано // на время покупки оружия.
            case 0 : yet_another_print_color( id, "%L.",  id, "VOTEBAN_BLOCKED" ) // Голосование за бан заблокировано
            default : yet_another_print_color( id, "%L %L",  id, "VOTEBAN_BLOCKED", id, "VOTEBAN_BLOCKED_TIME", i_pCvrRSDelay ) // Голосование за бан заблокировано // на %d сек. в начале раунда.
        }
       
        return false
    }

    if( g_bIsVoteStarted )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_ALREADY_STARTED" ) // В данный момент уже идёт голосование.
        return false
    }
   
    new szFlags, szCvarsFlags[ 3 ][ 24 ]
   
    szFlags = get_user_flags( id )
    get_pcvar_string( g_pcvr_AdminAccess, szCvarsFlags[ 0 ], charsmax( szCvarsFlags ) )
    get_pcvar_string( g_pcvr_TimeAccess, szCvarsFlags[ 1 ], charsmax( szCvarsFlags ) )
    get_pcvar_string( g_pcvr_Access, szCvarsFlags[ 2 ], charsmax( szCvarsFlags ) )
   
    if( szCvarsFlags[ 2 ][ 0 ] && !( szFlags & read_flags( szCvarsFlags[ 2 ] ) ) )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_NO_ACCESS" ) // К сожалению, у вас нет доступа к голосованию за бан.
       
        return false
    }
   
    if( szFlags & read_flags( szCvarsFlags[ 0 ] ) )
    {
        yet_another_print_color( id, "%L",  id, "VOTEBAN_YOU_ADMIN" ) // Используйте своё бан-меню.
       
        return false
    }
   
    if( g_iUserGametime[ id ] )
    {
        new iInterim, iDelayCvar
       
        iInterim = floatround( get_gametime() ) - g_iUserGametime[ id ]
        iDelayCvar = get_pcvar_num( g_pcvr_Delay )
       
        if( szCvarsFlags[ 1 ][ 0 ] && ( szFlags & read_flags( szCvarsFlags[ 1 ] ) ) )
            return true
       
        else if( iInterim < iDelayCvar * 60 )
        {
            yet_another_print_color( id, "%L",  id, "VOTEBAN_DELAY", ( iDelayCvar - ( iInterim / 60 ) ) + 1 ) // Вы должны подождать еще %d мин. после предыдущего голосования.
       
            return false
        }
    }

    return true
}

stock get_admins_online()
{
    new i, iAdmins, iTeam
   
    iAdmins = 0
   
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        new szFlags[ 24 ]; get_pcvar_string( g_pcvr_AdminAccess, szFlags, charsmax( szFlags ) )
       
        if( !get_user_status( i ) )
            continue
       
        if( !( get_user_flags( i ) & read_flags( szFlags ) ) )
            continue
       
        if( get_pcvar_num( g_pcvr_SpecAdmins ) )      
            iAdmins ++
        else
        {
            iTeam = get_user_team( i )
           
            if( !( ( iTeam == 2 ) || ( iTeam == 1 ) ) )
                continue
               
            iAdmins ++
        }
    }
   
    return iAdmins
}

stock get_players_online()
{
    new i, iPlayers
   
    for( i = 1; i <= MAX_PLAYERS; i ++ )
    {
        if( !get_user_status( i ) )
            continue

        iPlayers ++
    }
   
    return iPlayers
}
   
stock get_user_status( id )
{
#if defined DEBUG
    if( !is_user_connected( id ) || is_user_hltv( id ) /*|| is_user_bot( id )*/ )
#else
    if( !is_user_connected( id ) || is_user_hltv( id ) || is_user_bot( id ) )  
#endif
        return 0
   
    return 1
}
   
stock yet_another_print_color( id, szInput[], any:... )
{
    new szMessage[ 192 ]

    vformat( szMessage, charsmax( szMessage ), szInput, 3 )
    format( szMessage, charsmax( szMessage ), "^1[^4%s^1] %s", MSGS_PREFIX, szMessage )
   
    replace_all( szMessage, charsmax( szMessage ), "!g", "^4" ) // Green Color
    replace_all( szMessage, charsmax( szMessage ), "!n", "^1" ) // Default Color
    replace_all( szMessage, charsmax( szMessage ), "!t", "^3" ) // Team Color

    client_print_color( id, print_team_default, szMessage )
   
#if defined DEBUG
    client_print( 0, print_chat, "[ID%d]: %s", id, szMessage )
#endif
   
    return 1
}

// SendAudio
stock client_send_audio( id, iSoundID, iPitch = PITCH_NORM )
{
    static msgSendAudio = 0

    if( !msgSendAudio )
    {
        msgSendAudio = get_user_msgid("SendAudio");
    }

    message_begin( id ? MSG_ONE : MSG_ALL, msgSendAudio, _, id )
    write_byte( id )
    write_string( g_szMenuSounds[ iSoundID ])
    write_short( iPitch )
    message_end();
}
В чем проблема?
 

NeTvoyKenji

Пользователь
Регистрация
27 Мар 2019
Сообщения
423
Симпатии
47
В ланг нет всё это
Да что ты говоришь...
У всех в ланг-файле есть причины, а у тебя нет.
Только что открыл ланг-файл на одном из своих серверов и нашел причины. Как так?:eek:1579540354630.png
 

Nuriddin

Пользователь
Регистрация
6 Фев 2019
Сообщения
88
Симпатии
0
Предупреждения
30
Да что ты говоришь...
У всех в ланг-файле есть причины, а у тебя нет.
Только что открыл ланг-файл на одном из своих серверов и нашел причины. Как так?:eek:Посмотреть вложение 10436
[
Код:
[en]
VOTEBAN_MENU_TITLE = Vote for ban
VOTEBAN_MENU_TIME_TITLE    = Select ban time
VOTEBAN_MENU_PLAYERS_TITLE = Select player

VOTEBAN_MENU_PLAYER = Player:
VOTEBAN_MENU_REASON = Reason:
VOTEBAN_MENU_TIME = Ban time:
VOTEBAN_MENU_INITIATOR = Initiator:
VOTEBAN_MENU_SELECT_PLAYER = Select player
VOTEBAN_MENU_ENTER_REASON = Enter ban reason
VOTEBAN_MENU_START_VOTE = Start vote!
VOTEBAN_MENU_NOTIFY = Notify admins (\y%d online\w)
VOTEBAN_MENU_MINUTES = minutes
VOTEBAN_MENU_YES = \rVote for
VOTEBAN_MENU_NO = Vote against

VOTEBAN_MENU_NEXT = Next
VOTEBAN_MENU_BACK = Back
VOTEBAN_MENU_EXIT = Exit

VOTEBAN_ADMIN_NOTIFIED = %d admin(s) notificated about your complaint.
VOTEBAN_ADMIN_NOTIFICATION = %s wants to ban %s for !g"%s"!n.
VOTEBAN_IMMUNITY = Selected player player has immunity.
VOTEBAN_LEAVE = Selected player is not available for vote, maybe he left the server.
VOTEBAN_NEED_PLAYER = You must select player.
VOTEBAN_NEED_REASON = You must enter ban reason.
VOTEBAN_WHO_START = %s started voting for ban %s (!g%s!n).
VOTEBAN_NO_ACCESS = Sorry, you don't have access to vote for ban.
VOTEBAN_YOU_ADMIN = Use your ban-menu.
VOTEBAN_STARTED = Vote for ban already started.
VOTEBAN_BLOCKED = Vote for ban is unavailable now.
VOTEBAN_DELAY = You must wait %d minutes after previous vote.
VOTEBAN_NOT_ENOUGH_PLAYERS = Not enough players online to start vote.
VOTEBAN_ALREADY_STARTED = Vote for ban already started.
VOTEBAN_ALREADY_FINISHED = Vote for ban already finished.
VOTEBAN_BANNED = %s banned due to vote for ban!
VOTEBAN_ENDED = Vote for ban failed.

VOTEBAN_VOTE = For ban %s voted: %d, need: %d.

[ru]
VOTEBAN_MENU_TITLE = Голосование за бан
VOTEBAN_MENU_TIME_TITLE    = Выбор срока бана
VOTEBAN_MENU_PLAYERS_TITLE = Выбор игрока

VOTEBAN_MENU_PLAYER = Игрок:
VOTEBAN_MENU_REASON = Причина:
VOTEBAN_MENU_TIME = Время бана:
VOTEBAN_MENU_INITIATOR = Инициатор:
VOTEBAN_MENU_SELECT_PLAYER = Выбрать игрока
VOTEBAN_MENU_ENTER_REASON = Ввести причину бана
VOTEBAN_MENU_START_VOTE = Начать голосование!
VOTEBAN_MENU_NOTIFY = Сообщить админу (\y%d в сети\w)
VOTEBAN_MENU_MINUTES = минут
VOTEBAN_MENU_YES = \rЗабанить
VOTEBAN_MENU_NO = Не банить

VOTEBAN_MENU_NEXT = Далее
VOTEBAN_MENU_BACK = Назад
VOTEBAN_MENU_EXIT = Выход

VOTEBAN_ADMIN_NOTIFIED = Администраторов уведомлено о вашей жалобе: %d.
VOTEBAN_ADMIN_NOTIFICATION = %s хочет забанить %s за !g"%s"!n.
VOTEBAN_IMMUNITY = Выбранный игрок имеет иммунитет к бану.
VOTEBAN_LEAVE = Выбранный игрок недоступен для выбора, возможно он покинул сервер.
VOTEBAN_NEED_PLAYER = Вы должны выбрать игрока.
VOTEBAN_NEED_REASON = Вы должны ввести причину бана.
VOTEBAN_WHO_START = %s начал голосование за бан %s (!g%s!n)!
VOTEBAN_NO_ACCESS = К сожалению, у вас нет доступа к голосованию за бан.
VOTEBAN_YOU_ADMIN = Используйте своё бан-меню.
VOTEBAN_STARTED = Голосование за бан уже идёт.
VOTEBAN_BLOCKED = Голосование за бан в данный момент недоступно.
VOTEBAN_DELAY = Вы должны подождать еще %d мин. после предыдущего голосования.
VOTEBAN_NOT_ENOUGH_PLAYERS = Недостаточно игроков, чтобы начать голосование.
VOTEBAN_ALREADY_STARTED = В данный момент уже идёт голосование.
VOTEBAN_ALREADY_FINISHED = Голосование уже закончено.
VOTEBAN_BANNED = %s забанен через голосование!
VOTEBAN_ENDED = Голосование за бан провалено.

VOTEBAN_VOTE = За бан %s проголосовало: %d, нужно: %d.
о: %d, нужно: %d.[/CODE][DOUBLEPOST=1579541094][/DOUBLEPOST]что надо прописать в amxx.cfg? У меня Tак
yav_time_default 20
yav_ban_type "1"
yav_delay 3
yav_duration 15
yav_time 30
yav_percent 70
yav_min_players 3
yav_spec_admins 0
yav_roundstart_delay -1
yav_access
yav_time_access c
yav_admin_access d
yav_immunity_access a
yav_log_to_file 1
yav_ban_reason "2"
 

NeTvoyKenji

Пользователь
Регистрация
27 Мар 2019
Сообщения
423
Симпатии
47
Nuriddin, Во-первых, не нужно вводить людей в заблуждение. Ты пишешь, что у тебя версия 1.7, но квар yav_ban_reason был добавлен в последней, 1.8 версии.
Во-вторых, нужно при создании темы указывать всю нужную информацию, которая поможет в решении подобного рода проблем.
В-третьих, учись правильно излагать свои мысли, чтобы другие пользователя форума тебя понимали, а не заказывали услуги "ванги".
 

Nuriddin

Пользователь
Регистрация
6 Фев 2019
Сообщения
88
Симпатии
0
Предупреждения
30
Я все написал как надо, там написано что старая версия плагина, а ты про новый говоришь, запутал меня.
Благодарю всех за помощь!
Особенно тех кто помог.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу