Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

4 страниц V   1 2 3 »

voteban от Alka (Процентный вотебан - довёл до ума Safety1st)

, Safety1st - исправил ошибки и довёл плагин до ума.
Статус пользователя sxzar1987
сообщение 21.10.2012, 19:55
Сообщение #1
Стаж: 13 лет

Сообщений: 93
Благодарностей: 19
Полезность: < 0

Информация
i
Уведомление:
Новый релиз плагина от Safety1st - https://c-s.net.ua/forum/index.php?showtopic=46185


ЭТО ЕЩЁ ПОКА НЕ ОФИЦИАЛЬНЫЙ РЕЛИЗ ОТ Safety1st. ПЛАГИН ПО ХОДУ ОБНАРУЖЕНИЙ ОШИБОК БУДЕТ ДОРАБАТЫВАТЬСЯ! ПОЭТОМУ СЛЕДИМ ЗА ТЕМОЙ И ОБНОВЛЯЕМСЯ!!!
ССЫЛКА НА ПЛАГИН ВСЕГДА ОБНОВЛЯЕТСЯ МНОЮ...


Благодаря Safety1st, который взялся за этот плагин по моей просьбе мы имеет по моему мнениею лучший /voteban на любом сервере.
ПЛЮСЫ ПЛАГИНА ПЕРЕД ДРУГИМИ:
1) настраиваемый процент голоса за бан.
2) плагин работает методом - зашел читер и к примеру играют на сервере 10 человек, а процент за бан выставлен 20% = следовательно надо всего 2 человека из 10, чтобы прописали /voteban и выбрали ник читера.
Это хорошо тем, что если стоит другой вотебан, то иногда читер заходит и специально прописывает /voteban, тем самым блокируя вотебан другум.
3) удобное меню.
4) можно выставить ограничение времени за выбор ников.
5) при выборе ника, меню автоматически скрывается.
6) Если Вы случайно выбрали не тот ник, то можно отменить свой голос - выбрав тот же ник.
По моему это лучший /voteban.


CVAR'ы в amxx.cfg:
voteban_percent "20" / процент голосов для бана (т.е. если стоит "20" = 20% от всех на сервере, то следовательно из 10 играющих это 2 человека, из 20 это 4 чел., из 30 это 6 чел.. Поэтому ставьте по своему процент).
voteban_type "0" / (тип бана), "0" - автовыбор, стоит по умолчанию, т.е. при бане плагин сам выбирает бан по SteamID или по IP. "1" - баны по SteamID. "2" - баны по IP.
voteban_time "30" / на сколько будет игрок забанен.
voteban_reason " 3a6aHeH /voteban'om Ha %time% MuH.! Pa36aH TyT: ВАШ САЙТ" / причина бана, выводимая забаненому после бана и куда обращаться за разбаном.

Примечание:
- по умолчанию иммунитет у voteban'а для флагов 'a' и 'd'. Если захочется изменить иммунитет флагов от voteban'a, то настраивается в sma (исходнике).

Исходник в студию:
Скрытый текст
Код
/*
*    Vote Ban 2
*      Every player are able to vote for ban somebody.
*
*    Last update:
*      11/02/2012
*
*/

#include <amxmodx>

#define PLUGIN "Vote Ban 2"
#define VERSION "0.97beta"
#define AUTHOR "Safety1st/Alka"

// customizable parameters
#define MAX_PLAYERS 32
#define IMMUNITY_FLAG ( ADMIN_IMMUNITY | ADMIN_BAN )    /* flags 'a' & 'd', separate by '|' */
new gszPrefix[] = "[VOTEBAN]"    // set prefix for all chat messages; for example ">"
// end of customizable parameters

new giVotedPlayers[MAX_PLAYERS]    // player's voteban targets
new giVotes[MAX_PLAYERS]    // count of votes for ban that player
new giVoted[MAX_PLAYERS]    // count of votes for ban by that player

// macro; %1 - variable being modified, %2 - player id
#define CheckFlag(%1,%2)    ( %1 &   ( 1 << (%2-1) ) )
#define AddFlag(%1,%2)        ( %1 |=  ( 1 << (%2-1) ) )
#define RemoveFlag(%1,%2)    ( %1 &= ~( 1 << (%2-1) ) )

enum _:Labels {
    CVAR_PERCENT = 0,
    CVAR_BANTYPE,
    CVAR_BANTIME,
    CVAR_LIMIT,
    CVAR_REASON,
}
new pCvar[Labels]

enum _:Types {
    AUTO = 0,
    STEAMID,
    IP,
    AMXBAN,
    AMXBANS5,
    SUPERBAN
}

enum _:LogRecords {
    UNVOTE = 0,
    VOTE
}

new gszLogRecords[LogRecords][] = {
    "Player '%s' has canceled vote for banning '%s'",
    "Player '%s' has been voted for banning by '%s'"
}

public plugin_init() {
    register_plugin( PLUGIN, VERSION, AUTHOR )
    register_dictionary( "voteban.txt" )
    register_cvar( "voteban2", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED )

    register_saycmd( "voteban", "VoteBanMenu" )

    pCvar[CVAR_PERCENT] = register_cvar( "voteban_percent", "60" )
    pCvar[CVAR_BANTYPE] = register_cvar( "voteban_type", "0" )
    pCvar[CVAR_BANTIME] = register_cvar( "voteban_time", "20" )
    pCvar[CVAR_LIMIT] = register_cvar( "voteban_limit", "3" )
    pCvar[CVAR_REASON] = register_cvar( "voteban_reason", " 3a6aHeH /voteban'om Ha %time% MuH.! Pa36aH TyT: http://example.ru" )
}

register_saycmd( saycommand[], function[] ) {
    new szTemp[64]
    formatex( szTemp, charsmax(szTemp) - 1, "say %s", saycommand )
    register_clcmd( szTemp, function )
    formatex( szTemp, charsmax(szTemp) - 1, "say_team %s", saycommand )
    register_clcmd( szTemp, function )
    formatex( szTemp, charsmax(szTemp) - 1, "say /%s", saycommand )
    register_clcmd( szTemp, function )
    formatex( szTemp, charsmax(szTemp) - 1, "say .%s", saycommand )
    register_clcmd( szTemp, function )
    formatex( szTemp, charsmax(szTemp) - 1, "say_team /%s", saycommand )
    register_clcmd( szTemp, function )
    formatex( szTemp, charsmax(szTemp) - 1, "say_team .%s", saycommand )
    register_clcmd( szTemp, function )
}

public client_disconnect(id) {
    static iPlayers[32], iPlayersNum, i, iPlayer

    // check whether there were votes for ban by that player
    if ( giVoted[id] ) {
        get_players( iPlayers, iPlayersNum, "ch" )    // skip bots and HLTV
        for ( i = 0; i < iPlayersNum; i++ ) {
            iPlayer = iPlayers[i]
            if ( CheckFlag( giVotedPlayers[id], iPlayer ) )
                giVotes[iPlayer]--
        }
        giVotedPlayers[id] = 0
        giVoted[id] = 0
    }

    // check whether there were votes for ban that player
    if ( giVotes[id] ) {
        get_players( iPlayers, iPlayersNum, "ch" )    // skip bots and HLTV
        for ( i = 0; i < iPlayersNum; i++ ) {
            iPlayer = iPlayers[i]
            if ( CheckFlag( giVotedPlayers[iPlayer], id ) ) {
                RemoveFlag( giVotedPlayers[iPlayer], id )
                giVotes[id]--
                giVoted[iPlayer]--
            }
            if ( !giVotes[id] )
                break
        }
        giVotes[id] = 0    // just in case
    }
}

public VoteBanMenu(id) {
    static iPlayers[32], iPlayersNum, i, iPlayer

    get_players( iPlayers, iPlayersNum, "ch" )    // skip bots and HLTV
    if ( iPlayersNum < 3 ) {
        ColorPrint( id, "^4%s %L", gszPrefix, id, "VOTEBAN_NEED3" )
        return PLUGIN_HANDLED
    }

    // create and show menu
    new szTempString[64], szName[32], szInfo[3]
    formatex( szTempString, charsmax(szTempString) - 1, "%L\y:", id, "VOTEBAN_MENU" )
    new iMenu = menu_create( szTempString, "MenuHandle", .ml = 1 )
    new iCallback = menu_makecallback( "CallbackMenu" )
    menu_setprop( iMenu, MPROP_NUMBER_COLOR, "\r" )
    menu_setprop( iMenu, MPROP_EXIT, MEXIT_ALL )
    formatex( szTempString, charsmax(szTempString) - 1, "%L", id, "VOTEBAN_EXIT" )
    menu_setprop( iMenu, MPROP_EXITNAME, szTempString )
    formatex( szTempString, charsmax(szTempString) - 1, "%L", id, "VOTEBAN_NEXT" )
    menu_setprop( iMenu, MPROP_NEXTNAME, szTempString )
    formatex( szTempString, charsmax(szTempString) - 1, "%L", id, "VOTEBAN_BACK" )
    menu_setprop( iMenu, MPROP_BACKNAME, szTempString )

    for ( i = 0; i < iPlayersNum; i++ ) {
        iPlayer = iPlayers[i]
        get_user_name( iPlayer, szName, 31 )
        num_to_str( iPlayer, szInfo, charsmax(szInfo) )
        if ( get_user_flags(iPlayer) & IMMUNITY_FLAG ) {
            formatex( szTempString, charsmax(szTempString) - 1, "%s", szName )
            // don't set info[] if player has immunity
            menu_additem( iMenu, szTempString, "", .callback = iCallback )
        }
        else {
            new iPercent = get_percent( giVotes[iPlayer], iPlayersNum )
            if ( giVotes[iPlayer] && CheckFlag( giVotedPlayers[id], iPlayer ) )
                formatex( szTempString, charsmax(szTempString) - 1, "%s \d(\r%d%%\d) \y%L", szName, iPercent, id, "VOTEBAN_VOTED" )
            else
                formatex( szTempString, charsmax(szTempString) - 1, "%s \d(\r%d%%\d)", szName, iPercent )
            num_to_str( iPlayer, szInfo, charsmax(szInfo) )
            menu_additem( iMenu, szTempString, szInfo, .callback = iCallback )
        }
    }

    menu_display( id, iMenu )

    return PLUGIN_CONTINUE
}

public CallbackMenu( id, menu, item ) {
    new access, info[3], callback, szTempString[64]
    menu_item_getinfo( menu, item, access, info, charsmax(info) - 1, szTempString, charsmax(szTempString) - 1, callback )

    if ( info[0] == 0 )
        // player has immunity
        return ITEM_DISABLED

    new iPlayer = str_to_num(info)
    if ( iPlayer == id )
        return ITEM_DISABLED

    return ITEM_ENABLED
}

public MenuHandle( id, menu, item ) {
    if ( item == MENU_EXIT ) {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    }

    new access, info[3], callback
    menu_item_getinfo( menu, item, access, info, charsmax(info) - 1, .callback = callback )
    menu_destroy(menu)

    new iTarget = str_to_num(info)

    if ( !is_user_connected(iTarget) ) {
        VoteBanMenu(id)
        return PLUGIN_HANDLED
    }

    if ( CheckFlag( giVotedPlayers[id], iTarget ) ) {
        RemoveFlag( giVotedPlayers[id], iTarget )
        giVoted[id]--
        giVotes[iTarget]--

        new szName[32], szTargetName[32]
        get_user_name( id, szName, 31 )
        get_user_name( iTarget, szTargetName, 31 )
        MsgToLog( gszLogRecords[UNVOTE], szName, szTargetName )
        ColorPrint( 0, "^4%s %L", gszPrefix, LANG_SERVER, "VOTEBAN_UNVOTE", szName, szTargetName )
        client_print( id, print_center, "%L", id, "VOTEBAN_CLEAR" )
        return PLUGIN_HANDLED
    }

    new iLimit = get_pcvar_num( pCvar[CVAR_LIMIT] )
    if ( giVoted[id] >= iLimit ) {
        // don't let vote too much;)
        client_print( id, print_center, "%L", id, "VOTEBAN_LIMIT", iLimit )
        return PLUGIN_HANDLED
    }

    client_print( id, print_center, "%L", id, "VOTEBAN_SET" )
    giVoted[id]++
    giVotes[iTarget]++
    AddFlag( giVotedPlayers[id], iTarget )

    CheckVotes( iTarget, id )

    return PLUGIN_HANDLED
}

CheckVotes( target, voter ) {
    new szName[32], szTargetName[32]
    get_user_name( voter, szName, 31 )
    get_user_name( target, szTargetName, 31 )

    MsgToLog( gszLogRecords[VOTE], szTargetName, szName )
    ColorPrint( 0, "^4%s %L", gszPrefix, LANG_SERVER, "VOTEBAN_VOTE", szName, szTargetName )

    new iPlayers[32], iPlayersNum
    get_players( iPlayers, iPlayersNum, "ch" )    // skip bots and HLTV

    if ( get_percent( giVotes[target], iPlayersNum ) < get_pcvar_num( pCvar[CVAR_PERCENT] ) )
        return

    new iUserid = get_user_userid(target)
    new iType = get_pcvar_num( pCvar[CVAR_BANTYPE] )
    new iBanTime = get_pcvar_num( pCvar[CVAR_BANTIME] )
    new szReason[256]
    static szAuthid[32]
    get_pcvar_string( pCvar[CVAR_REASON], szReason, charsmax(szReason) - 1 )

    switch ( iType ) {
        case AMXBAN, AMXBANS5, SUPERBAN : {
            // clear unused template
            replace( szReason, 255, "%time%", " " )
        }
        default : {
            new szBanTime[4]
            num_to_str( iBanTime, szBanTime, 3 )
            // set actual ban time in the reason
            replace( szReason, 255, "%time%", szBanTime )
            static szHostname[64]
            if ( !szHostname[0] )
                get_cvar_string( "hostname", szHostname, 63 )
            get_user_authid( target, szAuthid, charsmax(szAuthid) - 1 )
            log_amx( "Ban: ^"%s<0><><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%d^") (reason ^"Voteban^")", szHostname, szTargetName, iUserid, szAuthid, iBanTime )
            ColorPrint( 0, "^4%s %L", gszPrefix, LANG_SERVER, "VOTEBAN_BAN", szTargetName, iBanTime )
        }
    }

    switch ( iType ) {
        case STEAMID :
            server_cmd( "kick #%d %s;wait;wait;wait;banid %d %s", iUserid, szReason, iBanTime, szAuthid )
        case IP : {
            new szIp[32]
            get_user_ip( target, szIp, charsmax(szIp) - 1, 1 /* without_port */ )
            server_cmd( "kick #%d %s;wait;wait;wait;addip %d %s", iUserid, szReason, iBanTime, szIp )
        }
        case AMXBAN :
            server_cmd( "amx_ban #%d %d ^"%s^"", iUserid, iBanTime, szReason )
        case AMXBANS5 :
            server_cmd( "amx_ban %d #%d ^"%s^"", iBanTime, iUserid, szReason )
        case SUPERBAN :
            server_cmd( "amx_superban #%d %d ^"%s^"", iUserid, iBanTime, szReason )
        default : {     // AUTO
            /* AMXX base plugin 'plmenu.amxx', code by MistaGee
            IF AUTHID STEAM_ID_LAN OR VALVE_ID_LAN OR HLTV, BAN PER IP TO DON'T BAN EVERYONE */
            if ( equal( "STEAM_ID_LAN", szAuthid ) || equal( "VALVE_ID_LAN", szAuthid ) || equal( "HLTV", szAuthid ) ) {
                new szIp[32]
                get_user_ip( target, szIp, charsmax(szIp) - 1, 1 /* without_port */ )
                server_cmd( "kick #%d %s;wait;wait;wait;addip %d %s", iUserid, szReason, iBanTime, szIp )
            }
            else
                server_cmd( "kick #%d %s;wait;wait;wait;banid %d %s", iUserid, szReason, iBanTime, szAuthid )
        }
    }
}

get_percent( value, tvalue ) {
    return floatround( floatmul( float(value) / float(tvalue) , 100.0 ) )
}

MsgToLog( szRawMessage[], any:... ) {
    static szLogFile[192] = "", szTime[32], fp
    if ( !szLogFile[0] ) {
        new szLogsDir[64], szDate[16]
        get_time ( "%Y%m", szDate, charsmax(szDate) )
        get_localinfo( "amxx_logs", szLogsDir, 63 )
        formatex( szLogFile, charsmax(szLogFile), "%s/voteban_%s.log", szLogsDir, szDate )
    }

    new szMessage[192]
    vformat( szMessage, charsmax( szMessage ), szRawMessage, 2 )

    get_time( "%m/%d/%Y - %H:%M:%S", szTime, 31 )
    fp = fopen( szLogFile, "a" )
    fprintf( fp, "L %s: %s^n", szTime, szMessage )
    fclose(fp)
}

ColorPrint( iReceiver, const szRawMessage[ ], any:... ) {
    static iMsgSayText = 0
    if( !iMsgSayText )
        iMsgSayText = get_user_msgid( "SayText" )

    new szMessage[192], iPlayers[32], iPlayersNum = 1, iPlayer
    vformat( szMessage, charsmax(szMessage) - 1, szRawMessage, 3 )
    replace_all( szMessage, charsmax(szMessage) - 1, "!n", "^1" )
    replace_all( szMessage, charsmax(szMessage) - 1, "!t", "^3" )
    replace_all( szMessage, charsmax(szMessage) - 1, "!g", "^4" )
    if ( szMessage[0] != '^1' || szMessage[0] != '^3' || szMessage[0] != '^4' )
        format( szMessage, charsmax(szMessage) - 1, "^1%s", szMessage )    // we must set initial default color if it is not provided explicitly

    if ( iReceiver )
        iPlayers[0] = iReceiver
    else {
        get_players( iPlayers, iPlayersNum, "ch" )    // skip bots and HLTV
        if ( !iPlayersNum )
            return    // don't print useless message
    }

    for ( new i = 0; i < iPlayersNum; i++ ) {
        iPlayer = iPlayers[i]
        if ( !is_user_connected(iPlayer) )
            continue

        message_begin( MSG_ONE_UNRELIABLE, iMsgSayText, _, iPlayer )
        write_byte(iPlayer)    // use target player as sender to see colors at all (and his own team color for ^3)
        write_string(szMessage)
        message_end()
    }
}


Отредактировал: insamez, - 12.8.2013, 19:11
Прикрепленные файлы:
Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение

Прикрепленные файлы:
Прикрепленный файл  voteban_с_процентами_от_Safety1st.rar ( 4,07 килобайт ) Кол-во скачиваний: 320
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   Цитировать сообщение
Статус пользователя Fred Perry
сообщение 21.10.2012, 20:21
Сообщение #2


Иконка группы

Стаж: 16 лет

Сообщений: 6594
Благодарностей: 2370
Полезность: 813

Исходник под спойлер.


Гнилой фашистской нечисти
Загоним пулю в лоб,
Отродью человечества
Сколотим крепкий гроб!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя sxzar1987
сообщение 21.10.2012, 20:46
Сообщение #3
Стаж: 13 лет

Сообщений: 93
Благодарностей: 19
Полезность: < 0

ОК

Скрытый текст
Код
#include <amxmodx>
#include <amxmisc>

#define PLUGIN "Vote Ban"
#define VERSION "1.0"
#define AUTHOR "Alka"

#define MAX_PLAYERS 33

#define MENU_KEYS (1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9)
#define MENU_SLOTS 8

new g_iMenuPage[MAX_PLAYERS];
new g_iVotedPlayers[MAX_PLAYERS];
new g_iVotes[MAX_PLAYERS];
new g_szVoteReason[MAX_PLAYERS][64];

new g_iPlayers[MAX_PLAYERS - 1];
new g_iNum;

new g_iMsgidSayText;

enum {
    CVAR_PERCENT = 0,
    CVAR_BANTYPE,
    CVAR_BANTIME
};
new g_szCvarName[][] = {
    "voteban_percent",
    "voteban_type",
    "voteban_time"
};
new g_szCvarValue[][] = {
    "20",
    "2",
    "20"
};
new g_iPcvar[3];
new g_szLogFile[64];

public plugin_init() {
    
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    register_saycmd("voteban", "Cmd_VoteBan", -1, "");
    register_clcmd("_voteban_reason", "Cmd_VoteBanReason", -1, "");
    
    register_menucmd(register_menuid("\rVOTEBAN \yMenu:"), MENU_KEYS, "Menu_VoteBan");
    
    for(new i = 0; i < 3; i++)
    {
        g_iPcvar[i] = register_cvar(g_szCvarName[i], g_szCvarValue[i]);
    }
    g_iMsgidSayText = get_user_msgid("SayText");
    
    new szLogInfo[] = "amx_logdir";
    get_localinfo(szLogInfo, g_szLogFile, charsmax(g_szLogFile));
    add(g_szLogFile, charsmax(g_szLogFile), "/voteban");
    
    if(!dir_exists(g_szLogFile))
        mkdir(g_szLogFile);
        
    new szTime[32];
    get_time("%d-%m-%Y", szTime, charsmax(szTime));
    format(g_szLogFile, charsmax(g_szLogFile), "%s/%s.log", g_szLogFile, szTime);
}

public client_disconnect(id)
{
    if(g_iVotedPlayers[id])
    {
        get_players(g_iPlayers, g_iNum, "h");
        
        for(new i = 0; i < g_iNum; i++)
        {
            if(g_iVotedPlayers[id] & (1 << g_iPlayers[i]))
            {
                g_iVotes[g_iPlayers[i]]--;
            }
        }
        g_iVotedPlayers[id] = 0;
    }
}

public Cmd_VoteBan(id)
{
    get_players(g_iPlayers, g_iNum, "h");
    
    if(g_iNum < 3)
    {
        client_printc(id, "\g> \dThis command is unavailable! Need at least 3 players.");
        return PLUGIN_HANDLED;
    }
    ShowBanMenu(id, g_iMenuPage[id] = 0);
    return PLUGIN_CONTINUE;
}

public ShowBanMenu(id, iPos)
{
    static i, iPlayer, szName[32];
    static szMenu[256], iCurrPos; iCurrPos = 0;
    static iStart, iEnd; iStart = iPos * MENU_SLOTS;
    static iKeys;
    
    get_players(g_iPlayers, g_iNum, "h");
    
    if(iStart >= g_iNum)
    {
        iStart = iPos = g_iMenuPage[id] = 0;
    }
    
    static iLen;
    iLen = formatex(szMenu, charsmax(szMenu), "\rVOTEBAN \yMenu:^n^n");
    
    iEnd = iStart + MENU_SLOTS;
    iKeys = MENU_KEY_0;
    
    if(iEnd > g_iNum)
    {
        iEnd = g_iNum;
    }
    
    for(i = iStart; i < iEnd; i++)
    {
        iPlayer = g_iPlayers[i];
        get_user_name(iPlayer, szName, charsmax(szName));
        
        iKeys |= (1 << iCurrPos++);
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d\w.%s \d(\r%d%%\d)^n", iCurrPos, szName, get_percent(g_iVotes[iPlayer], g_iNum));
    }
    
    if(iEnd != g_iNum)
    {
        formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r9\w.Next ^n\r0\w.%s", iPos ? "Back" : "Exit");
        iKeys |= MENU_KEY_9;
    }
    else
    {
        formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r0\w.%s", iPos ? "Back" : "Exit");
    }
    show_menu(id, iKeys, szMenu, -1, "");
    return PLUGIN_HANDLED;
}

public Menu_VoteBan(id, key)
{
    switch(key)
    {
        case 8:
        {
            ShowBanMenu(id, ++g_iMenuPage[id]);
        }
        case 9:
        {
            if(!g_iMenuPage[id])
                return PLUGIN_HANDLED;
            
            ShowBanMenu(id, --g_iMenuPage[id]);
        }
        default: {
            static iPlayer;
            iPlayer = g_iPlayers[g_iMenuPage[id] * MENU_SLOTS + key];
            
            if(!is_user_connected(iPlayer))
            {
                ShowBanMenu(id, g_iMenuPage[id]);
                return PLUGIN_HANDLED;
            }
            if(iPlayer == id)
            {
                client_print(id, print_center, "*You cannot voteban yourself!*");
                ShowBanMenu(id, g_iMenuPage[id]);
                
                return PLUGIN_HANDLED;
            }
            if(g_iVotedPlayers[id] & (1 << iPlayer))
            {
                client_print(id, print_center, "*You already votebanned this player!*");
                ShowBanMenu(id, g_iMenuPage[id]);
                
                return PLUGIN_HANDLED;
            }
            g_iVotes[iPlayer]++;
            g_iVotedPlayers[id] |= (1 << iPlayer);
            
            static szName[2][32];
            get_user_name(id, szName[0], charsmax(szName[]));
            get_user_name(iPlayer, szName[1], charsmax(szName[]));
            
            client_printc(0, "\g> \dPlayer \t%s \dvotebanned \t%s\d!", szName[0], szName[1]);
            
            CheckVotes(iPlayer, id);
            client_cmd(id, "messagemode _voteban_reason");
            
            ShowBanMenu(id, g_iMenuPage[id]);
        }
    }
    return PLUGIN_HANDLED;
}

public Cmd_VoteBanReason(id)
{
    if(!g_iVotedPlayers[id])
        return PLUGIN_HANDLED;
    
    new szArgs[64];
    read_argv(1, szArgs, charsmax(szArgs));
    
    if(szArgs[0])
    {
        formatex(g_szVoteReason[id], charsmax(g_szVoteReason[]), szArgs);
    }
    return PLUGIN_HANDLED;
}

public CheckVotes(id, voter)
{
    get_players(g_iPlayers, g_iNum, "h");
    new iPercent = get_percent(g_iVotes[id], g_iNum);
    
    if(iPercent >= get_pcvar_num(g_iPcvar[CVAR_PERCENT]))
    {
        switch(get_pcvar_num(g_iPcvar[CVAR_BANTYPE]))
        {
            case 1:
            {
                new szAuthid[32];
                get_user_authid(id, szAuthid, charsmax(szAuthid));
                server_cmd("kick #%d;wait;wait;wait;banid %d ^"%s^";wait;wait;wait;writeid", get_user_userid(id), get_pcvar_num(g_iPcvar[CVAR_BANTIME]), szAuthid);
            }
            case 2:
            {
                new szIp[32];
                get_user_ip(id, szIp, charsmax(szIp), 1);
                server_cmd("kick #%d;wait;wait;wait;addip %d ^"%s^";wait;wait;wait;writeip", get_user_userid(id), get_pcvar_num(g_iPcvar[CVAR_BANTIME]), szIp);
            }
        }
        g_iVotes[id] = 0;
        
        new szName[2][32];
        get_user_name(id, szName[0], charsmax(szName[]));
        get_user_name(id, szName[1], charsmax(szName[]));
        client_printc(0, "\g> \dPlayer \t%s \dhas been banned for \g%d\dmin. due voteban!", szName[0], get_pcvar_num(g_iPcvar[CVAR_BANTIME]));
        
        log_to_file(g_szLogFile, "Player '%s' voted for banning '%s' for: %s", szName[1], szName[0], g_szVoteReason[voter]);
    }
}

stock get_percent(value, tvalue)
{    
    return floatround(floatmul(float(value) / float(tvalue) , 100.0));
}

stock register_saycmd(saycommand[], function[], flags = -1, info[])
{
    static szTemp[64];
    formatex(szTemp, charsmax(szTemp), "say %s", saycommand);
    register_clcmd(szTemp, function, flags, info);
    formatex(szTemp, charsmax(szTemp), "say_team %s", saycommand);
    register_clcmd(szTemp, function, flags, info);
    formatex(szTemp, charsmax(szTemp), "say /%s", saycommand);
    register_clcmd(szTemp, function, flags, info);
    formatex(szTemp, charsmax(szTemp), "say .%s", saycommand);
    register_clcmd(szTemp, function, flags, info);
    formatex(szTemp, charsmax(szTemp), "say_team /%s", saycommand);
    register_clcmd(szTemp, function, flags, info);
    formatex(szTemp, charsmax(szTemp), "say_team .%s", saycommand);
    register_clcmd(szTemp, function, flags, info);
}

stock client_printc(id, const text[], any:...)
{
    
    new szMsg[191], iPlayers[32], iCount = 1;
    vformat(szMsg, charsmax(szMsg), text, 3);
    
    replace_all(szMsg, charsmax(szMsg), "\g","^x04");
    replace_all(szMsg, charsmax(szMsg), "\d","^x01");
    replace_all(szMsg, charsmax(szMsg), "\t","^x03");
    
    if(id)
        iPlayers[0] = id;
    else
        get_players(iPlayers, iCount, "ch");
    
    for(new i = 0; i < iCount; i++)
    {
        if(!is_user_connected(iPlayers[i]))
            continue;
        
        message_begin(MSG_ONE_UNRELIABLE, g_iMsgidSayText, _, iPlayers[i]);
        write_byte(iPlayers[i]);
        write_string(szMsg);
        message_end();
    }
}


Отредактировал: sxzar1987, - 21.10.2012, 22:01
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 21.10.2012, 21:31
Сообщение #4
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Под спойлер в тэгах code. Иначе такой код никак не получится использовать.
А совсем pro-уровень - когда вы SMA-прикрепляете вместо кода.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя sxzar1987
сообщение 21.10.2012, 22:05
Сообщение #5
Стаж: 13 лет

Сообщений: 93
Благодарностей: 19
Полезность: < 0

Сделал... Сорри, нуб на форуме. Будте осторожны... shok.gif

Просто этот плагин уже многие полюбили и везде все облазил... Если это сделать, то все рады будут.
Ато могут забанить и админов...

Повторюсь:
1) Надо поставить в плагин иммунитет админам.
2) Убрать, когда пишешь /voteban - появляется чат: и в чате надо написать причину. Так вот, многие тупят и думают это баг плагина перекидывает в чат при прописывании /voteban. Вот причину и надо убрать.


Примечание для стимула: кто это сможет сделать, тому кину на вебмани рублей 50.

Отредактировал: sxzar1987, - 21.10.2012, 23:13
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 21.10.2012, 23:53
Сообщение #6
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

А вот теперь можно и помочь ;)

Сделал, что ты просил. Только поправь изменённые тобой ранее значения в new g_szCvarValue[][] : неправильно было бы их как дефолтные делать. А ещё лучше - задай их, как и положено, cvar'ами.
--

Простой милый плагин с правильным принципом - никакого ограничения по времени голосований, читер не заблокирует.
Из неудобств только - отсутствие ML-поддержки.

Цитата
Изменения:
- добавлен иммунитет для админов, ниже в #define IMMUNITY_FLAG по умолчанию стоит флаг 'a'
- убрана причина для бана
- в меню все игроки присутствуют; но админов и себя выбрать нельзя. Кроме того, для админов не выводится % голосов.
- несколько прочих небольших фиксов, которые я посчитал нужным сделать.


Меню теперь выглядит так:
Прикрепленное изображение

Так фиксируются голосования игроков и собственно voteban игрока:
Прикрепленное изображение

--
Оформил всё красиво для новичков, чтобы к этому посту отсылать. SLINSHADY-творения - кака, а большинство ничего другого не знает.

Отредактировал: Safety1st, - 22.10.2012, 0:12
Прикрепленные файлы:
Прикрепленный файл  voteban_modified.sma ( 8,02 килобайт ) Кол-во скачиваний: 78
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя sxzar1987
сообщение 22.10.2012, 0:52
Сообщение #7
Стаж: 13 лет

Сообщений: 93
Благодарностей: 19
Полезность: < 0

всмысле поправь?) это не мой плагин а от Алка -)
сделай плиз без доделок, что бя скачал проверил и кинул денег...
Если что завтра проверю, если работает дам знать и оплачу!


+ ещё добавь там на 8 - Ha3aD, а на 9 - Next (ну для листалки) или она есть?

ОПЛАТУ ГАРАНТИРУЮ! Щас Спать, завтра проверю ЕСЛИ ЧТО НАПИШУ и оплачу!

Отредактировал: sxzar1987, - 22.10.2012, 0:57
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 22.10.2012, 0:56
Сообщение #8
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Ok, значит, не ты правил.
Спокойно ;) Просто у себя в amxx.cfg (ну или где ты там прописываешь настройки плагинов) пропиши:
Код
voteban_percent 20
voteban_time 20


И всё будет работать просто на ура good.gif

Отредактировал: Safety1st, - 22.10.2012, 0:58
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя sxzar1987
сообщение 22.10.2012, 0:59
Сообщение #9
Стаж: 13 лет

Сообщений: 93
Благодарностей: 19
Полезность: < 0

Аааа уяснил!!! Красавец спасибо! Кидай кеошелек R я кину 50 руб и пойду спать!!! ОБОЖАЮ ЭТОТ ФОРУМ!!!!!!!!!!!! ВЫ СУПЕР ВСЕ АААААААААА!-))))))))))))))
Заходите если, что к нам иногда-) http://vk.com/inter_cs

там это есть? + ещё добавь там на 8 - Ha3aD, а на 9 - Next (ну для листалки) или она есть?
СТОП: А можешь сделать авто-причину бана? Чтоб когда забанился ему в консоле была ссылка мол: 3a6aHeH /voteban'om! Pa36aH TyT: http://vk.com/inter_cs

Я докину ещё тада 20 и в итоге будя 50 рублевых?)
clapping.gif

Отредактировал: sxzar1987, - 22.10.2012, 1:12
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 22.10.2012, 1:11
Сообщение #10
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(sxzar1987 @ 22.10.2012, 2:59) *
ещё добавь там на 8 - Ha3aD, а на 9 - Next (ну для листалки) или она есть?

Всё остальное, как было, не переживай)

Цитата(sxzar1987 @ 22.10.2012, 2:59) *
СТОП: А можешь сделать авто-причину бана? Чтоб когда забанился ему в консоле была ссылка мол: 3a6aHeH /voteban'om! Pa36aH TyT: http://vk.com/inter_cs

Могу. Хотя ты банишь на 20 минут: кому оно надо - разбаниваться...

Отредактировал: Safety1st, - 22.10.2012, 1:17
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя sxzar1987
сообщение 22.10.2012, 1:12
Сообщение #11
Стаж: 13 лет

Сообщений: 93
Благодарностей: 19
Полезность: < 0

СТОП: А можешь сделать авто-причину бана? Чтоб когда забанился ему в консоле была ссылка мол: 3a6aHeH /voteban'om! Pa36aH TyT: http://vk.com/inter_cs
Я докину ещё тада 20 и в итоге будя 70 рублевых?)



Кидай уже кошель меня совесть мучает! Мечта, а не плагин!-)
50 рубелй кинул, жду ответа на дополнительный вопрос по автопричине...

Отредактировал: sxzar1987, - 22.10.2012, 1:16
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 22.10.2012, 18:56
Сообщение #12
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Вот новая версия. Добавлена ML-поддержка (многоязыковая поддержка) и вывод причины игроку с указанием времени бана. Пофикшен вывод в лог: теперь выводятся все голосования. Также была пофикшена проблема, что, когда игрок перезаходит, за него нельзя голосовать ;)

Причина задаётся в плагине редактированием этой строки внутри кавычек:
Код
new g_szReason[256] = " 3a6aHeH /voteban'om Ha %time% MuH.! Pa36aH TyT: http://example.ru";

В строке обязательно должен присутствовать шаблон %time%. Также рекомендую оставить пробел вначале - смотрится красивее.

Внимание! По умолчанию плагин банит по IP.

Не советую пока просить народ допиливать версию, потому что эта ещё не окончательная. Может быть в итоговой я сам какие-то пожелания реализую ;) Но это не сегодня и не завтра ;)

Прикрепленное изображение Прикрепленное изображение

Отредактировал: Safety1st, - 28.10.2012, 0:56
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 4 раз
   + Цитировать сообщение
Статус пользователя sxzar1987
сообщение 22.10.2012, 22:54
Сообщение #13
Стаж: 13 лет

Сообщений: 93
Благодарностей: 19
Полезность: < 0

Ты король мира кросафчеГ!
Король плаигинов! Я не думал, что так оперативно ты все сделаешь... Когда банят в табличке и в консоль пишет куда писать претензии по разбану! Классно! Я к те ещё обращусь кстати...

У МЕНЯ НА СЕРВАКЕ ТЕПЕРЬ В ОТСУТСТВИЕ АДМИНОВ ИГРОКИ ТЕРЬ ДОВОЛЬНЫ!!!-))) 20% надо всего (проценты менять можно), к примеру 20 игроков играют и надо чтоб всего-то 4 игрока прописали вотебан и выбрали один и от же ник... Классссс плагин! ЛУЧШИЙ ВОТЕБАН В МИРЕ ТЕПЕРЬ!

Кстати как поставлю себе на днях Супер бан - надо будет сделать этот плагин бан по супер бану... Я уже писал, что я заплачу тебе за идею бана по = супер_бан.

Отредактировал: sxzar1987, - 22.10.2012, 22:57
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
Safety1st
сообщение 28.10.2012, 0:34
Сообщение #14
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Новая версия :D

Изменения: добавлена поддержка банов через команды amx_ban (AMXBans, Advanced Bans) и amx_superban (SuperBan).
--

Описание:
Простой милый плагин с правильным принципом - никакого ограничения по времени голосований (читер не заблокирует). Каждому игроку для голосования за бан необходимо написать в чат /voteban (как в случае rtv) и выбрать 'жертву' через меню. Когда на какого-либо игрока набирается нужно число голосов - он банится. У 'админов' иммунитет: за них нельзя проголосовать.

Прикрепленное изображение Прикрепленное изображение

Настройка типа бана - cvar voteban_type:
1 - по SteamID (эквивалент AMXX-команды amx_ban)
2 - по IP (активен по умолчанию) (эквивалент AMXX-команды amx_banip )
3 - через amx_ban игрок время (AMXBans 6, Advanced Bans)
4 - через amx_ban время игрок (AMXBans 5)
5 - через amx_superban

Остальные 2 настройки cvar'ами:
voteban_percent - сколько %-в игроков должны проголосовать за бан; по умолчанию 80
voteban_time - на какое время в минутах банится игрок; по умолчанию 100

Настройки, которые задаются в sma:
Какой флаг даёт иммунитет от бана; по умолчанию это флаг 'a':
Код
#define IMMUNITY_FLAG ADMIN_IMMUNITY

Причина задаётся в плагине редактированием этой строки внутри кавычек:
Код
new g_szReason[256] = " 3a6aHeH /voteban'om Ha %time% MuH.! Pa36aH TyT: http://example.ru";

Вместо шаблона %time% при бане подставляется срок бана. Его наличие обязательно для типов банов 1 и 2. В случае типов 3-5 этот шаблон не обязателен и не используется. Также рекомендую оставить пробел вначале - смотрится красивее.

--

Отредактировал: Safety1st, - 8.12.2012, 1:35
Прикрепленные файлы:
Прикрепленный файл  voteban.zip ( 4,57 килобайт ) Кол-во скачиваний: 80
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 5 раз
   + Цитировать сообщение
cah9
сообщение 28.10.2012, 3:37
Сообщение #15
Стаж: 13 лет

Сообщений: 1159
Благодарностей: 360
Полезность: 0

Цитата(Safety1st @ 28.10.2012, 7:34) *
Новая версия :D

Изменения: добавлена поддержка банов через команды amx_ban (AMXBans, Advanced Bans) и amx_superban (SuperBan).
--

Описание:
Простой милый плагин с правильным принципом - никакого ограничения по времени голосований (читер не заблокирует). Каждому игроку для голосования за бан необходимо написать в чат /voteban (как в случае rtv) и выбрать 'жертву' через меню. Когда на какого-либо игрока набирается нужно число голосов - он банится. У 'админов' иммунитет: за них нельзя проголосовать.

Прикрепленное изображение Прикрепленное изображение

Настройка типа бана - cvar voteban_type:
1 - по SteamID (эквивалент AMXX-команды amx_ban)
2 - по IP (активен по умолчанию) (эквивалент AMXX-команды amx_banip )
3 - через amx_ban игрок время (AMXBans 6, Advanced Bans)
4 - через amx_ban время игрок (AMXBans 5)
5 - через amx_superban

Остальные 2 настройки cvar'ами:
voteban_percent - сколько %-в игроков должны проголосовать за бан; по умолчанию 80
voteban_time - на какое время в минутах банится игрок; по умолчанию 100

Настройки, которые задаются в sma:
Какой флаг даёт иммунитет от бана; по умолчанию это флаг 'a':
Код
#define IMMUNITY_FLAG ADMIN_IMMUNITY

Причина задаётся в плагине редактированием этой строки внутри кавычек:
Код
new g_szReason[256] = " 3a6aHeH /voteban'om Ha %time% MuH.! Pa36aH TyT: http://example.ru";

Вместо шаблона %time% при бане подставляется срок бана. Его наличие обязательно для типов банов 1 и 2. В случае типов 3-5 этот шаблон не обязателен и не используется. Также рекомендую оставить пробел вначале - смотрится красивее.
--

update
После 3-х загрузок чуток изменил плагин.

--


Можешь добавить. Если админ онлайн на сервере, вотебан не работает?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fred Perry
сообщение 28.10.2012, 6:46
Сообщение #16


Иконка группы

Стаж: 16 лет

Сообщений: 6594
Благодарностей: 2370
Полезность: 813

Если игрок играет на сервере менее 10 минут, Вотебаном он не можешь пользоваться.


Гнилой фашистской нечисти
Загоним пулю в лоб,
Отродью человечества
Сколотим крепкий гроб!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Yes I Do Not
сообщение 28.10.2012, 9:25
Сообщение #17


Стаж: 15 лет

Сообщений: 260
Благодарностей: 68
Полезность: 220

1 игрок может проголосовать за бан всего сервера или только за одного? и сделал бы сообщение
Код
VOTEBAN_VOTE = !g>!n Игрок !t%s!n проголосовал за бан !t%s!n!
всем кроме того за кого он проголосовал(szNamePlayer)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя primm
сообщение 28.10.2012, 9:48
Сообщение #18


Стаж: 16 лет
Город: Москва

Сообщений: 517
Благодарностей: 140
Полезность: 520

Цитата(c A h @ 28.10.2012, 4:37) *
Можешь добавить. Если админ онлайн на сервере, вотебан не работает?

а по мне лучше добавить в меню пунктик "cancelvote", для админов естественно и для инициатора голосования.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 28.10.2012, 16:56
Сообщение #19
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(Yes I Do Not @ 28.10.2012, 11:25) *
1 игрок может проголосовать за бан всего сервера или только за одного?

За всех, кого захочет. Не хотите банов честных игроков - не ставьте никакой плагин на voteban.

--
Народ, плагин - базовый, основа для всего остального. Фишки на него навешивать я не буду. Как переведу на современный код - опубликую в разделе с плагинами.
--

Цитата(Fred Perry @ 28.10.2012, 8:46) *
Если игрок играет на сервере менее 10 минут, Вотебаном он не можешь пользоваться.

В этом нет необходимости: в плагине нет ограничения по времени, читер не заблокирует голосовалку, проголосовав за какого-либо игрока. Больше нет причин лишать обычных игроков права голоса просто потому, что он мало играет.

Цитата(primm @ 28.10.2012, 11:48) *
а по мне лучше добавить в меню пунктик "cancelvote", для админов естественно и для инициатора голосования.

Меню у каждого - своё, тут другой принцип. Игрок может закрыть вызванное им меню, выбрав кнопку 'Выход'.

Отредактировал: Safety1st, - 28.10.2012, 16:57
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя primm
сообщение 28.10.2012, 20:01
Сообщение #20


Стаж: 16 лет
Город: Москва

Сообщений: 517
Благодарностей: 140
Полезность: 520

Цитата(Safety1st @ 28.10.2012, 16:56) *
Меню у каждого - своё, тут другой принцип. Игрок может закрыть вызванное им меню, выбрав кнопку 'Выход'.

извиняюсь писал еще не установив плагин. сейчас поставил. все супер, ток у мну в меню, при большом количестве игроков девятая строка пропадет.(

Прикрепленное изображение
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
4 страниц V   1 2 3 »
 
Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: