#include <amxmodx>
#pragma semicolon 1
new szPluginInfo[][] = { "VoteBan Menu", "1.1" };
// Для поддержки создания услуги: Иммунитет от VoteBan'a
// NOTE: Требуется плагин GameCms API
// Закомментируйте для отключения поддержки GameCMS API
#define SUPPORT_CMS
// Название файла для записи логов
// NOTE: расширение ".log" Обязательно!
#define LogFile_Name "VoteBan_Menu.log"
// Стандартные причины VoteBan.
// Максимальное кол-во 8 (Иначе сломается меню)
// Пункт "Своя причина" добавляется в конце списка.
new g_aBanReasons[][64] = {
"Читер",
"Флуд в Микро",
"Мешает играть",
"Оскорбляет игроков",
"Неадекватное поведение"
};
#if defined SUPPORT_CMS
#include <gamecms5>
#endif
new g_iReasonsMenu;
new g_iVoteMenu;
new _access, callback, ItemData[3];
new g_iInsider;
new g_iVoteStartTime;
new g_iVoteCount, bool:g_bIsVoted[33];
new g_iVictim;
new g_sBanReason[128];
new g_iVoteBanPlayersNum, g_iVoteBanPlayers[33];
enum E_Cvars {
C_Access_VTB,
C_AccessFlags[16],
C_ChatPrefix[16],
C_MinPlayers,
Float:C_BanRatio,
C_TimeBetween,
Float:C_DurationVote,
C_BanTime,
C_BanType,
C_FlagsImmunity[16],
C_AdminFlags[16],
#if defined SUPPORT_CMS
C_ServiceName[32],
#endif
}
new Cvars[E_Cvars];
public plugin_init() {
register_clcmd("voteban", "CmdVoteban");
register_clcmd("say /voteban", "CmdVoteban");
register_clcmd("say_team /voteban", "CmdVoteban");
register_clcmd("say /vtb", "CmdVoteban");
register_clcmd("say_team /vtb", "CmdVoteban");
register_clcmd("vtb_reason", "ClCmdReason");
register_srvcmd("voteban_lockmap", "Check_LockMap");
register_dictionary("VoteBan_Menu.txt");
}
public plugin_precache() {
register_plugin(szPluginInfo[0], szPluginInfo[1], "Author + ApXuTekToR" );
InitCvars();
}
public plugin_cfg() {
#if defined SUPPORT_CMS
if(is_plugin_loaded("GameCMS_API") == INVALID_PLUGIN_ID) {
log_amx("WARNING: GameCMS API isn't loaded! Plugin Stopped.");
pause("a");
return;
}
#endif
create_menu();
}
create_menu() {
g_iReasonsMenu = menu_create("\d[\rVoteBan\d] \yВыберите причину бана\w", "ReasonsMenuHandler");
g_iVoteMenu = menu_create("UNNAMED_MENU", "VoteMenuHandler");
menu_setprop(g_iReasonsMenu, MPROP_EXIT, MEXIT_NEVER);
menu_setprop(g_iReasonsMenu, MPROP_PERPAGE, 0);
menu_setprop(g_iVoteMenu, MPROP_EXIT, MEXIT_NEVER);
new num[3];
for(new i; i < sizeof g_aBanReasons; i++) {
num_to_str(i, num, charsmax(num));
menu_additem(g_iReasonsMenu, g_aBanReasons[i], num);
}
menu_addblank(g_iReasonsMenu, 0);
menu_additem(g_iReasonsMenu, "\yСвоя причина", "69");
menu_additem(g_iVoteMenu, "\rДа", "1");
menu_additem(g_iVoteMenu, "\yНет", "0");
}
InitCvars() {
bind_pcvar_string(create_cvar( "VoteBan_ChatPrefix", "VB", FCVAR_NONE, "Префикс для чат сообщений" ), Cvars[C_ChatPrefix], charsmax(Cvars[C_ChatPrefix]));
bind_pcvar_num(create_cvar( "VoteBan_MinPlayers", "5", FCVAR_NONE, "Минимальное кол-во игроков на сервере для запуска голосования" ), Cvars[C_MinPlayers]);
bind_pcvar_float(create_cvar( "VoteBan_BanRatio", "0.8", FCVAR_NONE, "Коэффицент голосов для бана.^n\
'0.1' - 10% | '1.0' - 100%" ), Cvars[C_BanRatio]);
bind_pcvar_num(create_cvar( "VoteBan_TimeBetween", "5", FCVAR_NONE, "Время между голосованиями (в секундах)" ), Cvars[C_TimeBetween]);
bind_pcvar_float(create_cvar( "VoteBan_DurationVote", "15.0", FCVAR_NONE, "Продолжительность голосования" ), Cvars[C_DurationVote]);
bind_pcvar_num(create_cvar( "VoteBan_BanType", "1", FCVAR_NONE, "Тип наказания:^n\
'0' - кик^n\
'1' - AmxBans/FreshBans^n\
'2' - Lite Bans (Neugomon)" ), Cvars[C_BanType]);
bind_pcvar_num(create_cvar( "VoteBan_BanTime", "1440", FCVAR_NONE, "Время бана (в минутах)" ), Cvars[C_BanTime]);
bind_pcvar_num(create_cvar( "VoteBan_Access_VTB", "0", FCVAR_NONE, "Кому доступно право на голосование?^n\
'0' - Доступно всем^n\
'1' - По флагу доступа" ), Cvars[C_Access_VTB]);
bind_pcvar_string(create_cvar( "VoteBan_AccessFlags", "t", FCVAR_NONE, "Флаг доступа к вотебану" ), Cvars[C_AccessFlags], charsmax(Cvars[C_AccessFlags]));
bind_pcvar_string(create_cvar( "VoteBan_FlagsImmunity", "a", FCVAR_NONE, "Флаг иммунитета от бана" ), Cvars[C_FlagsImmunity], charsmax(Cvars[C_FlagsImmunity]));
#if defined SUPPORT_CMS
bind_pcvar_string(create_cvar( "VoteBan_ServiceImmunity", "_vtb_immunity", FCVAR_PROTECTED, "Название услуги для иммунитета от вотебана" ), Cvars[C_ServiceName], charsmax(Cvars[C_ServiceName]));
#endif
bind_pcvar_string(create_cvar( "VoteBan_AdminFlags", "d", FCVAR_PROTECTED, "Флаг Администратора^n\
Note: Если игрок с данным флагом на сервере - голосование недоступно" ), Cvars[C_AdminFlags], charsmax(Cvars[C_AdminFlags]));
AutoExecConfig(true, "Voteban_Menu", "SevCorp");
}
#if defined SUPPORT_BLOCK
public block_plug() {
new bool:IsAccess = false;
new szServerIP[22]; get_user_ip(0, szServerIP, charsmax(szServerIP));
for(new i; i < sizeof(PluginIP); i++) {
if(equal(PluginIP[i], szServerIP))
IsAccess = true;
}
if(!IsAccess) {
server_print("[ %s v%s ] Нужна лицензия? - Купи тут: https://epic-cs.ru/forums", szPluginInfo[0], szPluginInfo[1]);
set_fail_state("[ %s v%s ] Вот ты и папался дружок! Нет лицензии - иди гуляй!", szPluginInfo[0], szPluginInfo[1]);
}
}
#endif
public client_disconnected(id) {
if(g_bIsVoted[id]) {
g_bIsVoted[id] = false;
g_iVoteCount--;
}
}
public CmdVoteban(id) {
if(Cvars[C_Access_VTB] == 1) {
if(CheckAccess(id, Cvars[C_AccessFlags])) {
ClCmdVoteban(id);
} else {
client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]);
return PLUGIN_HANDLED;
}
} else if(Cvars[C_Access_VTB] == 0) {
ClCmdVoteban(id);
}
return PLUGIN_HANDLED;
}
public ClCmdVoteban(id) {
static players[32], pnum, iVtbDelay;
if(g_iInsider)
return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ALREADY_RUNNING", Cvars[C_ChatPrefix]);
if((iVtbDelay = g_iVoteStartTime + Cvars[C_TimeBetween] - get_systime()) > 0)
return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_AVAILABLE_VIA_TIME", Cvars[C_ChatPrefix], (iVtbDelay / 60), (iVtbDelay % 60));
get_players(players, pnum);
if(Cvars[C_MinPlayers] > pnum)
return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_MIN_PLAYERS", Cvars[C_ChatPrefix], Cvars[C_MinPlayers]);
g_iVoteBanPlayersNum = 0;
for(new i; i < pnum; i++) {
if(CheckAccess(players[i], Cvars[C_AdminFlags]))
return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ADMIN_CHECK", Cvars[C_ChatPrefix]);
g_iVoteBanPlayers[g_iVoteBanPlayersNum++] = players[i];
}
return SelectPlayerOnBan(id);
}
public SelectPlayerOnBan(id) {
new iPlayersMenu = menu_create("\d[\rVoteBan\d] \yВыберите игрока\w", "PlayersMenuHandler");
new iCallBack = menu_makecallback("PlayersMenuCallback");
menu_setprop(iPlayersMenu, MPROP_BACKNAME, "Назад");
menu_setprop(iPlayersMenu, MPROP_NEXTNAME, "Далее");
menu_setprop(iPlayersMenu, MPROP_EXITNAME, "Выход");
new name[32], num[3];
for(new i; i < g_iVoteBanPlayersNum; i++) {
if(g_iVoteBanPlayers[i] == id)
continue;
get_user_name(g_iVoteBanPlayers[i], name, charsmax(name));
num_to_str(g_iVoteBanPlayers[i], num, charsmax(num));
menu_additem(iPlayersMenu, name, num, 0, iCallBack);
}
menu_display(id, iPlayersMenu, 0);
return PLUGIN_HANDLED;
}
public PlayersMenuCallback(id, menu, item) {
static ItemName[32], ItemNewName[64];
menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), ItemName, charsmax(ItemName), callback);
#if defined SUPPORT_CMS
static Array:Services;
Services = cmsapi_get_user_services(str_to_num(ItemData), "", Cvars[C_ServiceName]);
if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]) || Services)
#else
if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]))
#endif
{
formatex(ItemNewName, charsmax(ItemNewName), "\d%s \y[\rИммунитет\y]", ItemName);
menu_item_setname(menu, item, ItemNewName);
return ITEM_DISABLED;
}
return ITEM_ENABLED;
}
public PlayersMenuHandler(id, menu, item) {
if(item == MENU_EXIT) {
menu_destroy(menu);
return PLUGIN_HANDLED;
}
menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);
g_iVictim = str_to_num(ItemData);
menu_destroy(menu);
return menu_display(id, g_iReasonsMenu);
}
public ReasonsMenuHandler(id, menu, item) {
menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);
new ReasonId = str_to_num(ItemData);
if(ReasonId == 69) {
client_cmd(id, "messagemode vtb_reason");
} else {
g_sBanReason = g_aBanReasons[ReasonId];
VoteBanAction(id);
}
return PLUGIN_HANDLED;
}
public ClCmdReason(id) {
if(Cvars[C_Access_VTB] == 1) {
if(CheckAccess(id, Cvars[C_AccessFlags])) {
client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]);
return PLUGIN_HANDLED;
}
}
static sReason[64];
read_args(sReason, charsmax(sReason));
remove_quotes(sReason);
g_sBanReason = sReason[0] ? sReason : "unknown";
return VoteBanAction(id);
}
VoteBanAction(id) {
static sInsName[32], sVicName[32], sTitle[256];
get_user_name(id, sInsName, charsmax(sInsName));
get_user_name(g_iVictim, sVicName, charsmax(sVicName));
formatex(sTitle, charsmax(sTitle), "\rЗабанить \y%s\w?^n\rПричина\w: \y%s^n\dЗапустил \r%s", sVicName, g_sBanReason, sInsName);
menu_setprop(g_iVoteMenu, MPROP_TITLE, sTitle);
g_iInsider = id;
g_iVoteStartTime = get_systime();
g_iVoteCount = 0;
arrayset(g_bIsVoted, false, sizeof(g_bIsVoted));
for(new i; i < g_iVoteBanPlayersNum; ++i) {
if(g_iVoteBanPlayers[i] != g_iVictim)
menu_display(g_iVoteBanPlayers[i], g_iVoteMenu);
}
return set_task(Cvars[C_DurationVote], "VoteBanResults");
}
public VoteMenuHandler(id, menu, item) {
if(item != MENU_EXIT) {
menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);
if(str_to_num(ItemData)) {
g_iVoteCount++;
g_bIsVoted[id] = true;
}
}
return PLUGIN_HANDLED;
}
public VoteBanResults() {
show_menu(0, 0, "^n", 1); // визуально закрываем меню.
if(is_user_connected(g_iVictim)) {
new iVoteBanMinVotes = floatround(Cvars[C_BanRatio] * float(g_iVoteBanPlayersNum));
new name[32]; get_user_name(g_iVictim, name, charsmax(name));
if(g_iVoteCount >= iVoteBanMinVotes) {
if(Cvars[C_BanType] == 0) server_cmd("kick #%d ^"%s^"", get_user_userid(g_iVictim), g_sBanReason);
else if(Cvars[C_BanType] == 1) server_cmd("amx_ban %d #%d ^"%s^"", Cvars[C_BanTime], get_user_userid(g_iVictim), g_sBanReason);
else if(Cvars[C_BanType] == 2) server_cmd("amx_ban #%d %d ^"%s^"", get_user_userid(g_iVictim), Cvars[C_BanTime], g_sBanReason);
client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_1", Cvars[C_ChatPrefix]);
client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes);
log_to_file(LogFile_Name, "VOTEBAN SUCCESS: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name, g_sBanReason, g_iVoteCount, iVoteBanMinVotes);
} else {
client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_1", Cvars[C_ChatPrefix]);
client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes);
log_to_file(LogFile_Name, "VOTEBAN FAILED: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name, g_sBanReason, g_iVoteCount, iVoteBanMinVotes);
}
} else client_print_color(g_iInsider, print_team_default, "%L", LANG_PLAYER, "LANG_PLAYER_IS_OUT", Cvars[C_ChatPrefix]);
g_iInsider = g_iVictim = 0;
}
public Check_LockMap() {
new getmap[32], map[32];
read_args(getmap, charsmax(getmap));
remove_quotes(getmap);
get_mapname(map, charsmax(map));
if(!strcmp(getmap, map, true))
pause("ad");
}
CheckAccess(const Id, const Flags[]) {
static FlagsBits; FlagsBits = read_flags(Flags);
return (get_user_flags(Id) & FlagsBits || !FlagsBits);
}