voteban от Alka (Процентный вотебан - довёл до ума Safety1st), Safety1st - исправил ошибки и довёл плагин до ума. |
Здравствуйте, гость Вход | Регистрация
Наши новости:
|
|
|
voteban от Alka (Процентный вотебан - довёл до ума Safety1st), Safety1st - исправил ошибки и довёл плагин до ума. |
sxzar1987
|
21.10.2012, 19:55
Сообщение
|
|||
|
|
Информация
ЭТО ЕЩЁ ПОКА НЕ ОФИЦИАЛЬНЫЙ РЕЛИЗ ОТ 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
Прикрепленные файлы:
Прикрепленные файлы:
|
|||
Поблагодарили 2 раз
|
||||
Fred Perry
|
21.10.2012, 20:21
Сообщение
|
![]() ![]() |
Исходник под спойлер.
![]() Гнилой фашистской нечисти
Загоним пулю в лоб, Отродью человечества Сколотим крепкий гроб! |
|
|
|
Safety1st
|
21.10.2012, 21:31
Сообщение
|
|
|
Под спойлер в тэгах code. Иначе такой код никак не получится использовать.
А совсем pro-уровень - когда вы SMA-прикрепляете вместо кода. |
Поблагодарили 1 раз
|
|
sxzar1987
|
22.10.2012, 0:59
Сообщение
|
|
|
Аааа уяснил!!! Красавец спасибо! Кидай кеошелек R я кину 50 руб и пойду спать!!! ОБОЖАЮ ЭТОТ ФОРУМ!!!!!!!!!!!! ВЫ СУПЕР ВСЕ АААААААААА!-))))))))))))))
Заходите если, что к нам иногда-) http://vk.com/inter_cs там это есть? + ещё добавь там на 8 - Ha3aD, а на 9 - Next (ну для листалки) или она есть? СТОП: А можешь сделать авто-причину бана? Чтоб когда забанился ему в консоле была ссылка мол: 3a6aHeH /voteban'om! Pa36aH TyT: http://vk.com/inter_cs Я докину ещё тада 20 и в итоге будя 50 рублевых?)
Отредактировал: sxzar1987, - 22.10.2012, 1:12
|
|
|
|
Safety1st
|
22.10.2012, 1:11
Сообщение
|
|
|
ещё добавь там на 8 - Ha3aD, а на 9 - Next (ну для листалки) или она есть? Всё остальное, как было, не переживай) СТОП: А можешь сделать авто-причину бана? Чтоб когда забанился ему в консоле была ссылка мол: 3a6aHeH /voteban'om! Pa36aH TyT: http://vk.com/inter_cs Могу. Хотя ты банишь на 20 минут: кому оно надо - разбаниваться...
Отредактировал: Safety1st, - 22.10.2012, 1:17
|
|
|
|
sxzar1987
|
22.10.2012, 1:12
Сообщение
|
|
|
СТОП: А можешь сделать авто-причину бана? Чтоб когда забанился ему в консоле была ссылка мол: 3a6aHeH /voteban'om! Pa36aH TyT: http://vk.com/inter_cs
Я докину ещё тада 20 и в итоге будя 70 рублевых?) Кидай уже кошель меня совесть мучает! Мечта, а не плагин!-) 50 рубелй кинул, жду ответа на дополнительный вопрос по автопричине...
Отредактировал: sxzar1987, - 22.10.2012, 1:16
|
|
|
|
primm
|
28.10.2012, 9:48
Сообщение
|
![]() |
|
|
|
|
primm
|
28.10.2012, 20:01
Сообщение
|
![]() |
|
|
|
|
![]() ![]() |