Пользователь
- Сообщения
- 33
- Реакции
- 0
Помогите добавить , проверку на игроков , что бы команды /voteban и /votekick работали когда на сервере не меньше чем 4 игрока, пожалуйста
Код:
#include <amxmodx>
const VOTE_DELAY = 5; // Интервалы между голосованиями
const VOTE_TIME = 10; // Длительность голосования
const VOTE_PERCENT = 60; // Проценты для успешного голосования
const BAN_TYPE = 1; // 0 - кик; 1 - amxbans/fresh bans/lite bans; 2 - superban
#define KICK_INSIDER // Удалять с сервера инсайдера голосования, если недостаточно голосов
const ADMIN_FLAG = ADMIN_BAN; // Флаг админа, в присутствии которого, голосование нельзя запустить
const IMMUN_FLAG = ADMIN_IMMUNITY; // Флаг иммунитета к кику/бану
new const PREFIX[] = "Голосование"; // Префикс в чате
new const BAN_PREFIX[] = "VoteBan"; // Префикс причины при бане
new const KICK_PREFIX[] = "VoteKick"; // Префикс причины при кике
new g_arrBanTimes[] =
// Время бана
{
30,
60,
120,
180,
360,
1440,
2880
};
new g_arrBanReasons[][64] =
// Причины бана
{
"Aim",
"Wallhack",
"Speadhack",
"Мат/Оскорбление",
"Школьник/ Нет 18+",
"Большой Пинг"
};
new g_arrKickReasons[][64] =
// Причины кика
{
"Реклама/Флуд/Спам",
"Мат/Оскорбление",
"Большой Пинг",
"Школьник/ Нет 18+",
"Микрофон/ Шум",
"Мешает Играть"
};
#if !defined MAX_PLAYERS
const MAX_PLAYERS = 32;
#endif
enum VoteMenus
{
Ban,
Kick,
LAST // don't modify
};
enum StaticMenus
{
ReasonsMenu,
VotesMenu
};
enum MenuStruct
{
VoteMenus:Menu,
Pos,
Setting,
ReasonId
};
enum VoteData
{
Insider,
Victim,
LastVote,
numPlayersOnVote,
bool:bVoted[MAX_PLAYERS + 1],
votes
};
new g_iVote[VoteMenus][VoteData];
new g_iAnyVote[VoteMenus][StaticMenus], g_iUsersVoteMenu;
new g_iVoteMenu[MAX_PLAYERS + 1][MenuStruct];
new g_iPlayers[MAX_PLAYERS + 1][MAX_PLAYERS];
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define client_disconnected client_disconnect
#endif
public plugin_init()
{
register_plugin("Player Votes", "1.0", "neugomon");
register_clcmd("say /voteban", "clcmd_VoteBan");
register_clcmd("say /votekick", "clcmd_VoteKick");
register_menucmd(register_menuid("PlayerVotes Menu"), 1023, "PlayersMenuHandler");
}
public plugin_cfg()
{
g_iAnyVote[Ban][ReasonsMenu] = menu_create("\d[\rPlayerVoteBan\d] \wВыберите причину", "ReasonsMenuHandler");
g_iAnyVote[Kick][ReasonsMenu] = menu_create("\d[\rPlayerVoteKick\d] \wВыберите причину", "ReasonsMenuHandler");
menu_setprop(g_iAnyVote[Ban][ReasonsMenu], MPROP_NEXTNAME, "Далее");
menu_setprop(g_iAnyVote[Ban][ReasonsMenu], MPROP_BACKNAME, "Назад");
menu_setprop(g_iAnyVote[Ban][ReasonsMenu], MPROP_EXITNAME, "Выход");
menu_setprop(g_iAnyVote[Kick][ReasonsMenu], MPROP_NEXTNAME, "Далее");
menu_setprop(g_iAnyVote[Kick][ReasonsMenu], MPROP_BACKNAME, "Назад");
menu_setprop(g_iAnyVote[Kick][ReasonsMenu], MPROP_EXITNAME, "Выход");
for(new i, str[3]; i < sizeof g_arrBanReasons; i++)
{
num_to_str(i, str, charsmax(str));
menu_additem(g_iAnyVote[Ban][ReasonsMenu], g_arrBanReasons[i], str);
}
for(new i, str[3]; i < sizeof g_arrKickReasons; i++)
{
num_to_str(i, str, charsmax(str));
menu_additem(g_iAnyVote[Kick][ReasonsMenu], g_arrKickReasons[i], str);
}
g_iUsersVoteMenu = menu_create("TITLE", "VotesMenuHandler");
menu_setprop(g_iUsersVoteMenu, MPROP_EXIT, MEXIT_NEVER);
menu_additem(g_iUsersVoteMenu, "\rДа", "1");
menu_additem(g_iUsersVoteMenu, "\yНет", "0");
}
public client_disconnected(id)
{
if(g_iVote[Ban][bVoted][id])
{
g_iVote[Ban][bVoted][id] = false;
g_iVote[Ban][votes]--;
}
if(g_iVote[Kick][bVoted][id])
{
g_iVote[Kick][bVoted][id] = false;
g_iVote[Kick][votes]--;
}
}
public clcmd_VoteBan(id)
{
if(HasAdminInServer(id))
return PLUGIN_HANDLED;
if(IsVoteDenied(id, Ban))
return PLUGIN_HANDLED;
g_iVote[Ban][Insider] = id;
g_iVote[Ban][LastVote] = get_systime();
g_iVoteMenu[id][Menu] = any:Ban;
g_iVoteMenu[id][Pos] = 0;
g_iVoteMenu[id][Setting] = 0;
BuildMenu(id, g_iVoteMenu[id][Pos]);
return PLUGIN_HANDLED;
}
public clcmd_VoteKick(id)
{
if(HasAdminInServer(id))
return PLUGIN_HANDLED;
if(IsVoteDenied(id, Kick))
return PLUGIN_HANDLED;
g_iVote[Kick][Insider] = id;
g_iVote[Kick][LastVote] = get_systime();
g_iVoteMenu[id][Menu] = any:Kick;
g_iVoteMenu[id][Pos] = 0;
g_iVoteMenu[id][Setting] = 0;
BuildMenu(id, g_iVoteMenu[id][Pos]);
return PLUGIN_HANDLED;
}
public PlayersMenuHandler(id, iKey)
{
switch(iKey)
{
case 7:
{
switch(VoteMenus:g_iVoteMenu[id][Menu])
{
case Ban:
{
if(++g_iVoteMenu[id][Setting] > charsmax(g_arrBanTimes))
g_iVoteMenu[id][Setting] = 0;
BuildMenu(id, g_iVoteMenu[id][Pos]);
}
case Kick: VoteKickHandler(id, g_iPlayers[id][g_iVoteMenu[id][Pos] * 8 + iKey]);
}
}
case 8: BuildMenu(id, ++g_iVoteMenu[id][Pos]);
case 9:
{
if(g_iVoteMenu[id][Pos])
BuildMenu(id, --g_iVoteMenu[id][Pos]);
else
{
g_iVote[g_iVoteMenu[id][Menu]][Insider] = 0;
g_iVote[g_iVoteMenu[id][Menu]][LastVote] = 0;
}
}
default:
{
switch(VoteMenus:g_iVoteMenu[id][Menu])
{
case Ban: VoteBanHandler(id, g_iPlayers[id][g_iVoteMenu[id][Pos] * 7 + iKey]);
case Kick: VoteKickHandler(id, g_iPlayers[id][g_iVoteMenu[id][Pos] * 8 + iKey]);
}
}
}
return PLUGIN_HANDLED;
}
public ReasonsMenuHandler(id, menu, item)
{
new _access, callback, szReasonID[3];
menu_item_getinfo(menu, item, _access, szReasonID, charsmax(szReasonID), .callback = callback);
g_iVoteMenu[id][ReasonId] = str_to_num(szReasonID);
VoteHandler(id, g_iVoteMenu[id][Menu]);
return PLUGIN_HANDLED;
}
public VotesMenuHandler(id, menu, item)
{
new _access, callback, szVote[2];
menu_item_getinfo(menu, item, _access, szVote, charsmax(szVote), .callback = callback);
if(str_to_num(szVote))
{
g_iVote[VoteMenus:GetCurrentVote()][bVoted][id] = true;
g_iVote[VoteMenus:GetCurrentVote()][votes]++;
}
}
public CheckResults(VoteMenus:menu)
{
show_menu(0, 0, "^n", 1);
if(!is_user_connected(g_iVote[menu][Victim]))
{
g_iVote[menu][Insider]= 0;
g_iVote[menu][Victim] = 0;
client_print_color(g_iVote[menu][Insider], print_team_default, "^1[^4%s^1] Игрок покинул сервер!", PREFIX);
return;
}
new minVotes = floatround(g_iVote[menu][numPlayersOnVote] * VOTE_PERCENT / 100.0);
new szVictimName[32];
get_user_name(g_iVote[menu][Victim], szVictimName, charsmax(szVictimName));
new szVoteTo[15];
switch(menu)
{
case Ban: formatex(szVoteTo, charsmax(szVoteTo), "Ban");
case Kick:formatex(szVoteTo, charsmax(szVoteTo), "Kick");
}
if(minVotes > g_iVote[menu][votes])
{
client_print_color(
0,
print_team_default,
"^1[^4%s^1] Голосование завершено! Игрок ^3%s ^1не был ^3забанен^1! ^1[^4Голосов: ^3%d ^1| ^4Необходимо: ^3%d^1]",
PREFIX,
szVictimName,
g_iVote[menu][votes],
minVotes
);
log_amx(
"Vote to %s FAILED. Player ^"%s^" [Reason: ^"%s^"][Vote: %d | MinVote: %d]",
szVoteTo,
szVictimName,
g_arrBanReasons[g_iVoteMenu[g_iVote[menu][Insider]][ReasonId]],
g_iVote[menu][votes],
minVotes
);
#if defined KICK_INSIDER
server_cmd("kick #%d ^"Злоупотребление Vote%s функцией!^"", get_user_userid(g_iVote[menu][Insider]), szVoteTo);
#endif
}
else
{
switch(menu)
{
case Ban:
{
switch(BAN_TYPE)
{
case 0:
{
server_cmd(
"kick #%d ^"[%s] %s^"",
get_user_userid(g_iVote[Ban][Victim]),
BAN_PREFIX,
g_arrBanReasons[g_iVoteMenu[g_iVote[Ban][Insider]][ReasonId]]
);
}
case 1:
{
server_cmd(
"amx_ban %d #%d ^"[%s] %s^"",
g_arrBanTimes[g_iVoteMenu[g_iVote[Ban][Insider]][Setting]],
get_user_userid(g_iVote[Ban][Victim]),
BAN_PREFIX,
g_arrBanReasons[g_iVoteMenu[g_iVote[Ban][Insider]][ReasonId]]
);
}
case 2:
{
server_cmd(
"amx_superban #%d %d ^"[%s] %s^"",
get_user_userid(g_iVote[Ban][Victim]),
g_arrBanTimes[g_iVoteMenu[g_iVote[Ban][Insider]][Setting]],
BAN_PREFIX,
g_arrBanReasons[g_iVoteMenu[g_iVote[Ban][Insider]][ReasonId]]
);
}
}
}
case Kick:
{
server_cmd(
"kick #%d ^"[%s] Причина %s^"",
get_user_userid(g_iVote[Kick][Victim]),
KICK_PREFIX,
g_arrBanReasons[g_iVoteMenu[g_iVote[Kick][Insider]][ReasonId]]
);
}
}
client_print_color(
0,
print_team_default,
"^1[^4%s^1] Голосование завершено! Игрок ^3%s ^1был ^3забанен^1! ^1[^4Голосов: ^3%d ^1| ^4Необходимо: ^3%d^1]",
PREFIX,
szVictimName,
g_iVote[menu][votes],
minVotes
);
log_amx(
"Vote to %s SUCCESS. Player ^"%s^" [Reason: ^"%s^"][Vote: %d | MinVote: %d]",
szVoteTo,
szVictimName,
g_arrBanReasons[g_iVoteMenu[g_iVote[menu][Insider]][ReasonId]],
g_iVote[menu][votes],
minVotes
);
}
g_iVote[menu][Insider]= 0;
g_iVote[menu][Victim] = 0;
}
BuildMenu(id, pos)
{
new pnum;
get_players(g_iPlayers[id], pnum, "ch");
new items;
new keys = MENU_KEY_0;
new iLen, szMenu[512];
switch(VoteMenus:g_iVoteMenu[id][Menu])
{
case Ban:
{
items = 7;
keys |= MENU_KEY_8;
iLen = formatex(
szMenu, charsmax(szMenu),
"\d[\rPlayerVoteBan\d] \yВыберите игрока\w\R%d/%d^n^n",
pos + 1,
(pnum / items + ((pnum % items) ? 1 : 0))
);
}
case Kick:
{
items = 8;
iLen = formatex(
szMenu, charsmax(szMenu),
"\d[\rPlayerVoteKick\d] \yВыберите игрока\w\R%d/%d^n^n",
pos + 1,
(pnum / items + ((pnum % items) ? 1 : 0))
);
}
}
new start = pos * items;
new end = start + items;
if(start >= pnum)
start = pos = g_iVoteMenu[id][Pos] = 0;
if(end > pnum)
end = pnum;
for(new i = start, a, pid, szName[32]; i < end; i++)
{
pid = g_iPlayers[id][i];
get_user_name(pid, szName, charsmax(szName));
if(id == pid)
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s \y[\rЭто Вы\y]^n", ++a, szName);
else if(get_user_flags(pid) & IMMUN_FLAG)
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s \y[\rИммунитет\y]^n", ++a, szName);
else
{
keys |= (1 << a++);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", a, szName);
}
}
switch(VoteMenus:g_iVoteMenu[id][Menu])
{
case Ban:
{
new szEnding[10], iBanTime = GetEnding(g_arrBanTimes[g_iVoteMenu[id][Setting]], szEnding, charsmax(szEnding));
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r8. \wЗабанить на \y%d \w%s^n", iBanTime, szEnding);
}
}
if(end != pnum)
{
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r9. \yДалее^n\r0. \r%s", pos ? "Назад" : "Выход");
keys |= MENU_KEY_9;
}
else formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r0. \r%s", pos ? "Назад" : "Выход");
return show_menu(id, keys, szMenu, -1, "PlayerVotes Menu");
}
VoteBanHandler(id, pid)
{
if(!is_user_connected(pid))
{
client_print_color(id, print_team_default, "^1[^4%s^1] Игрок покинул сервер!", PREFIX);
return;
}
g_iVote[Ban][Victim] = pid;
menu_display(id, g_iAnyVote[Ban][ReasonsMenu], 0);
}
VoteKickHandler(id, pid)
{
if(!is_user_connected(pid))
{
client_print_color(id, print_team_default, "^1[^4%s^1] Игрок покинул сервер!", PREFIX);
return;
}
g_iVote[Kick][Victim] = pid;
menu_display(id, g_iAnyVote[Kick][ReasonsMenu], 0);
}
VoteHandler(id, VoteMenus:menu)
{
g_iVote[menu][votes] = 0;
arrayset(g_iVote[menu][bVoted], false, sizeof g_iVote[][bVoted]);
new szInsiderName[32], szVictimName[32];
new szVoteTo[32], szTitle[256];
get_user_name(id, szInsiderName, charsmax(szInsiderName));
get_user_name(g_iVote[menu][Victim], szVictimName, charsmax(szVictimName));
switch(menu)
{
case Ban: formatex(szVoteTo, charsmax(szVoteTo), "Забанить");
case Kick:formatex(szVoteTo, charsmax(szVoteTo), "Кикнуть");
}
formatex(
szTitle, charsmax(szTitle),
"\r%s \y%s\w?^n\rПричина\w: \y%s^n\dЗапустил \r%s",
szVoteTo,
szVictimName,
g_arrBanReasons[g_iVoteMenu[id][ReasonId]],
szInsiderName
);
menu_setprop(g_iUsersVoteMenu, MPROP_TITLE, szTitle);
new players[MAX_PLAYERS];
get_players(players, g_iVote[menu][numPlayersOnVote], "ch");
for(new i; i < g_iVote[menu][numPlayersOnVote]; i++)
{
if(players[i] != g_iVote[menu][Victim])
menu_display(players[i], g_iUsersVoteMenu);
}
set_task(float(VOTE_TIME), "CheckResults", any:menu);
}
GetEnding(minutes, szEnding[], len)
{
if(minutes / 10080 > 0)
{
formatex(szEnding, len, "нед.");
return minutes / 10080;
}
else if(minutes / 1440 > 0)
{
formatex(szEnding, len, "дн.");
return minutes / 1440;
}
else if(minutes / 60 > 0)
{
formatex(szEnding, len, "ч.");
return minutes / 60;
}
formatex(szEnding, len, "мин.");
return minutes;
}
GetCurrentVote()
{
for(new i; i < any:LAST; i++)
{
if(g_iVote[VoteMenus:i][Insider])
return i;
}
return -1;
}
bool:HasAdminInServer(id)
{
if(get_user_flags(id) & ADMIN_FLAG)
{
client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! Вы - администратор!", PREFIX);
return true;
}
new players[MAX_PLAYERS], pnum;
get_players(players, pnum, "ch");
for(new i; i < pnum; i++)
{
if(id == players[i])
continue;
if(~get_user_flags(players[i]) & ADMIN_FLAG)
continue;
client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3запрещено^1! На сервере ^3есть ^1администратор!", PREFIX);
return true;
}
return false;
}
bool:IsVoteDenied(id, VoteMenus:menu)
{
if(GetCurrentVote() != -1)
{
client_print_color(id, print_team_default, "^1[^4%s^1] Голосование ^3уже запущено^1!", PREFIX);
return true;
}
new diff = ((g_iVote[menu][LastVote] + VOTE_DELAY * 60) - get_systime());
if(diff > 0)
{
client_print_color(
id,
print_team_default,
"^1[^4%s^1] Голосование ^3запрещено^1! Следующее голосование будет доступно через ^3%d ^1мин ^3%d ^1сек",
PREFIX,
(diff / 60),
(diff % 60)
);
return true;
}
return false;
}
Вложения
-
14.4 KB Просмотры: 14