/* AMX Mod X
* Admin Плагин Голосов
*
* AMX Mod X команды разработки
* первоначально разработанная OLO
*
* Этот файл является частью AMX Mod X.
*
*
* Эта программа является свободным программным обеспечением; вы можете распространять и/или модифицировать ее
* в соответствии с условиями GNU General Public License, опубликованной
* Free Software Foundation; либо версии 2 лицензии, либо (по
* вашему выбору) любой более поздней версии.
*
* Эта программа распространяется в надежде что она будет полезной, но
* Без каких-либо гарантий; даже без подразумеваемых гарантий
* ТОВАРНОСТИ или пригодности для определенной цели. Смотрите GNU
* General Public License for more details.
*
* Вы должны были получить копию GNU General Public License
* вместе с этой программой; если нет, напишите в Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Кроме того, в качестве особого исключения, автор дает разрешение
* ссылка на код этой программы с Half-Life Game Engine ("HL
* Двигатель") и модифицированных игровых библиотек ("модов"), разработанная компанией Valve,
* L. L. C ("Клапан"). Вы должны подчиняться GNU General Public License во всех
* уважает весь код, используемый другими, чем HL движка и модов
* от клапана. Если вы измените этот файл, вы можете распространить это исключение
* для вашей версии файла, но Вы не обязаны это делать. Если
* Вы не хотите сделать так, удалить заявление об исключении из
* версии.
*/
#include <файл файл файл amxmodx>
#include <amxmisc>
новые g_Answer[128]
новые g_optionName[4][64]
новые g_voteCount[4]
новые g_validMaps
новые g_yesNoVote
новые g_coloredMenus
новые g_voteCaller
новые g_Execute[256]
новые g_execLen
new bool:g_execResult
new Float:g_voteRatio
public plugin_init()
{
register_plugin("Admin голосов", AMXX_VERSION_STR, "AMXX Dev Team")
register_dictionary("adminvote.txt")
register_dictionary("common.txt")
register_dictionary("mapsmenu.txt")
register_menucmd(register_menuid("изменить карту "), MENU_KEY_1|MENU_KEY_2, "voteCount")
register_menucmd(register_menuid("выберите карту: "), MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4, "voteCount")
register_menucmd(register_menuid("удар "), MENU_KEY_1|MENU_KEY_2, "voteCount")
register_menucmd(register_menuid("запрет "), MENU_KEY_1|MENU_KEY_2, "voteCount")
register_menucmd(register_menuid("Голосование: "), MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4, "voteCount")
register_menucmd(register_menuid("результат: "), MENU_KEY_1|MENU_KEY_2, "actionResult")
register_concmd("amx_votemap", "cmdVoteMap", ADMIN_VOTE, "<map> [map] [map] [map]")
register_concmd("amx_votekick", "cmdVoteKickBan", ADMIN_VOTE, "<имя или #userid>")
register_concmd("amx_voteban", "cmdVoteKickBan", ADMIN_VOTE, "<имя или #userid>")
register_concmd("amx_vote", "cmdVote", ADMIN_VOTE, "<question> <answer#1> <answer#2>")
register_concmd("amx_cancelvote", "cmdCancelVote", ADMIN_VOTE, "- отменяет последнее голосование")
register_cvar("amx_vote_ratio", "0.02")
register_cvar("amx_vote_time", "10")
register_cvar("amx_vote_answers", "1")
register_cvar("amx_vote_delay", "60")
register_cvar("amx_last_voting", "0")
register_cvar("amx_show_activity", "2")
register_cvar("amx_votekick_ratio", "0.40")
register_cvar("amx_voteban_ratio", "0.40")
register_cvar("amx_votemap_ratio", "0.40")
g_coloredMenus = colored_menus()
}
общественная cmdCancelVote(id, level, cid)
{
if (!cmd_access(id, level, cid, 0))
return PLUGIN_HANDLED
если (task_exists(99889988, 1))
{
новые authid[32], name[32]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
log_amx("голосование: ^"%s<%d><%s><>^" отменить голосование сессии", " имя", get_user_userid(id), authid)
новые maxpl=get_maxplayers();
new msg[256];
for (new i = 1; i <= maxpl; i++)
{
if (is_user_connected(i) && !is_user_bot(я))
{
// HACK: ADMIN_CANC_VOTE_{1,2} ключи были разработаны очень слабо. Удалить все : и %s в нем.
LookupLangKey(msg, charsmax(msg), "ADMIN_CANC_VOTE_1", i);
replace_all(msg, charsmax(msg), "%s", "");
replace_all(msg, charsmax(msg), ":", "");
trim(msg);
show_activity_id(i, id, name, msg);
}
}
console_print(id, "%L", id, "VOTING_CANC")
client_print(0,print_chat,"%L",LANG_PLAYER,"VOTING_CANC")
remove_task(99889988, 1)
set_cvar_float("amx_last_voting", get_gametime())
}
еще
console_print(id, "%L", id, "NO_VOTE_CANC")
return PLUGIN_HANDLED
}
общественная delayedExec(cmd[])
server_cmd("%s", cmd)
общественная autoRefuse()
{
log_amx("голосование: %L", "ru", "RES_REF")
client_print(0, print_chat, "%L", LANG_PLAYER, "RES_REF")
}
public actionResult(id, key)
{
remove_task(4545454)
переключатель (клавиша)
{
case 0:
{
set_task(2.0, "delayedExec", 0, g_Execute, g_execLen)
log_amx("голосование: %L", "ru", "RES_ACCEPTED")
client_print(0, print_chat, "%L", LANG_PLAYER, "RES_ACCEPTED")
}
случай 1: autoRefuse()
}
вернуть PLUGIN_HANDLED
}
общественная checkVotes()
{
новые лучшие = 0
if (!g_yesNoVote)
{
for (new a = 0; a < 4; a++)
если (g_voteCount[a] > g_voteCount[best])
лучший = a
}
новые votesNum = g_voteCount[0] + g_voteCount[1] + g_voteCount[2] + g_voteCount[3]
новые iRatio = votesNum ? floatround(g_voteRatio * float(votesNum), floatround_ceil) : 1
новые iResult = g_voteCount[лучший]
new Players[32], pnum, я
get_players(players, pnum, "c")
if (iResult < iRatio)
{
новые lVotingFailed[64]
for (i = 0; i < pnum; i++)
{
Формат(lVotingFailed, 63, "%L", players[i], "VOTING_FAILED")
если (g_yesNoVote)
client_print(players[i], print_chat, "%L", players[i], "VOTING_RES_1", lVotingFailed, g_voteCount[0], g_voteCount[1], iRatio)
еще
client_print(players[i], print_chat, "%L", players[i], "VOTING_RES_2", lVotingFailed, iResult, iRatio)
}
Формат(lVotingFailed, 63, "%L", "ru", "VOTING_FAILED")
log_amx("голосование: %s (прт ^"%d^") (нужен ^"%d^")", lVotingFailed, iResult, iRatio)
return PLUGIN_CONTINUE
}
g_execLen = Формат(g_Execute, 255, g_Answer, g_optionName[best]) + 1
если (g_execResult)
{
g_execResult = false
if (is_user_connected(g_voteCaller))
{
новые menuBody[512], lTheResult[32], щелок[16], лно[16]
Формат(lTheResult, 31, "%L", g_voteCaller, "THE_RESULT")
Формат(щелок, 15, "%L", g_voteCaller, "да")
Формат(лно, 15, "%L", g_voteCaller, "нет")
новые len = format(menuBody, 511, g_coloredMenus ? "\y%s: \w%s^n^n" : "%s: %s^n^n", lTheResult, g_Execute)
len += format(menuBody[len], 511 - len, g_coloredMenus ? "\y%L^n\w" : "%L^n", g_voteCaller, "WANT_CONTINUE")
format(menuBody[len], 511 - len, "^n1. %s^n2. %s", щелоков, лно)
show_menu(g_voteCaller, 0x03, menuBody, 10, "результат: ")
set_task(10.0, "autoRefuse", 4545454)
}
еще
set_task(2.0, "delayedExec", 0, g_Execute, g_execLen)
}
новые lVotingSuccess[32]
for (i = 0; i < pnum; i++)
{
Формат(lVotingSuccess, 31, "%L", players[i], "VOTING_SUCCESS")
client_print(players[i], print_chat, "%L", players[i], "VOTING_RES_3", lVotingSuccess, iResult, iRatio, g_Execute)
}
Формат(lVotingSuccess, 31, "%L", "ru", "VOTING_SUCCESS")
log_amx("голосование: %s (прт ^"%d^") (нужен ^"%d^") (результат ^"%s^")", lVotingSuccess, iResult, iRatio, g_Execute)
return PLUGIN_CONTINUE
}
общественная voteCount(id, key)
{
if (get_cvar_num("amx_vote_answers"))
{
new name[32]
get_user_name(id, name, 31)
если (g_yesNoVote)
client_print(0, print_chat, "%L", LANG_PLAYER ключевые ? "VOTED_AGAINST" : "VOTED_FOR", name)
еще
client_print(0, print_chat, "%L", LANG_PLAYER, "VOTED_FOR_OPT", name, key + 1)
}
++g_voteCount[key]
return PLUGIN_HANDLED
}
общественная cmdVoteMap(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new Float:голосование = get_cvar_float("amx_last_voting")
если (голосование > get_gametime())
{
console_print(id, "%L", id, "ALREADY_VOTING")
return PLUGIN_HANDLED
}
если (голосование && голосования + get_cvar_float("amx_vote_delay") > get_gametime())
{
console_print(id,,, "%L", id, "VOTING_NOT_ALLOW")
return PLUGIN_HANDLED
}
новые argc = read_argc()
if (argc > 5) argc = 5
g_validMaps = 0
g_optionName[0][0] = 0
g_optionName[1][0] = 0
g_optionName[2][0] = 0
g_optionName[3][0] = 0
for (new i = 1; i < argc; ++i)
{
read_argv(я, g_optionName[g_validMaps], 31)
если (is_map_valid(g_optionName[g_validMaps]))
g_validMaps++
}
если (g_validMaps == 0)
{
новые lMaps[16]
Формат(lMaps, 15, "%L", id, (argc == 2) ? "MAP_IS" : "MAPS_ARE")
console_print(id, "%L", id, "GIVEN_NOT_VALID", lMaps)
return PLUGIN_HANDLED
}
новые menu_msg[256], len = 0
новые ключи = 0
если (g_validMaps > 1)
{
ключи = MENU_KEY_0
len = format(menu_msg, 255, g_coloredMenus ? "\y%L: \w^n^n" : "%L ^n^n", LANG_SERVER, "CHOOSE_MAP")
new temp[128]
for (new a = 0; a < g_validMaps; ++a)
{
Формат(temp, 127, "%d. %s^n", a+1, g_optionName[a])
len += copy(menu_msg[len], 255-len, temp)
ключи |= (1<<a)
}
Формат(menu_msg[len], 255-len, "^n0. %L", LANG_SERVER, "NONE")
g_yesNoVote = 0
} else {
новые lChangeMap[32], щелок[16], лно[16]
Формат(lChangeMap, 31, "%L", LANG_SERVER, "CHANGE_MAP_TO")
Формат(щелок, 15, "%L", LANG_SERVER, "да")
Формат(лно, 15, "%L", LANG_SERVER, "нет")
Формат(menu_msg, 255, g_coloredMenus ? "\y%s %s?\w^n^n1. %s^n2. %s" : "%s %s?^n^n1. %s^n2. %s", lChangeMap, g_optionName[0], щелоков, лно)
ключи = MENU_KEY_1|MENU_KEY_2
g_yesNoVote = 1
}
новые authid[32], name[32]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
if (argc == 2)
log_amx("голосование: ^"%s<%d><%s><>^" голосование карту (карту ^"%s^")", " имя", get_user_userid(id), authid, g_optionName[0])
еще
log_amx("голосование: ^"%s<%d><%s><>^" голосование карты (map#1 ^"%s^") (карта#2 ^"%s^") (карта#3 ^"%s^") (карта#4 ^"%s^")", " имя", get_user_userid(id), authid, g_optionName[0], g_optionName[1], g_optionName[2], g_optionName[3])
новые maxpl=get_maxplayers();
new msg[256];
for (new i = 1; i <= maxpl; i++)
{
если (is_user_connected(i) && !is_user_bot(я))
{
// HACK: ADMIN_VOTE_MAP_{1,2} ключи были разработаны очень слабо. Удалить все : и %s в нем.
LookupLangKey(msg, charsmax(msg), "ADMIN_VOTE_MAP_1", i);
replace_all(msg, charsmax(msg), "%s", "");
replace_all(msg, charsmax(msg), ":", "");
trim(msg);
show_activity_id(i, id, name, msg);
}
}
g_execResult = true
new Float:vote_time = get_cvar_float("amx_vote_time") + 2.0
set_cvar_float("amx_last_voting", get_gametime() + vote_time)
g_voteRatio = get_cvar_float("amx_votemap_ratio")
g_Answer = "changelevel %s"
show_menu(0, ключи, menu_msg, floatround(vote_time), (g_validMaps > 1) ? "Выбрать карту: " : "изменить карту ")
set_task(vote_time, "checkVotes", 99889988)
g_voteCaller = id
console_print(id, "%L", id, "VOTING_STARTED")
g_voteCount= {0, 0, 0, 0}
return PLUGIN_HANDLED
}
общественная cmdVote(id, level, cid)
{
if (!cmd_access(id, level, cid, 4))
return PLUGIN_HANDLED
new Float:голосование = get_cvar_float("amx_last_voting")
если (голосование > get_gametime())
{
console_print(id, "%L", id, "ALREADY_VOTING")
return PLUGIN_HANDLED
}
если (голосование && голосования + get_cvar_float("amx_vote_delay") > get_gametime())
{
console_print(id, "%L", id, "VOTING_NOT_ALLOW")
вернутьPLUGIN_HANDLED
}
новый квест[48]
read_argv(1, квест, 47)
если (содержит(квест", "sv_password") != -1 || содержать(квест", "rcon_password") != -1)
{
console_print(id, "%L", id, "VOTING_FORBIDDEN")
return PLUGIN_HANDLED
}
новые count=read_argc();
for (new i=0;i<4 && (i+2)<count;i++)
{
read_argv(i+2, g_optionName[i], sizeof(g_optionName[])-1);
}
новые authid[32], name[32]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
log_amx("голосование: ^"%s<%d><%s><>^" Пользовательское голосование (вопрос ^"%s^") (вариант#1 ^"%s^") (вариант#2 ^"%s^")", " имя", get_user_userid(id), authid, квест, g_optionName[0], g_optionName[1])
новые maxpl=get_maxplayers();
new msg[256];
for (new i = 1; i <= maxpl; i++)
{
if (is_user_connected(i) && !is_user_bot(я))
{
// HACK: ADMIN_VOTE_CUS_{1,2} ключи были разработаны очень слабо. Удалить все : и %s в нем.
LookupLangKey(msg, charsmax(msg), "ADMIN_VOTE_CUS_1", i);
replace_all(msg, charsmax(msg), "%s", "");
replace_all(msg, charsmax(msg), ":", "");
trim(msg);
show_activity_id(i, id, name, msg);
}
}
новые menu_msg[512], lVote[16]
Формат(lVote, 15, "%L", LANG_SERVER, "голос")
count-=2;
if (count>4)
{
count=4;
}
// счетчик теперь показывает, сколько вариантов были перечислены
новые ключи=0;
for (new i=0;i<count;i++)
{
ключи |= (1<<i);
}
новые len=formatex(menu_msg, sizeof(menu_msg)-1, g_coloredMenus ? "\y%s: %s\w^n^n" : "%s: %s^n^n", lVote, quest);
for (new i=0;i<count;i++)
{
len+=formatex(menu_msg[len], sizeof(menu_msg) - 1 - len ,"%d. %s^n",i+1,g_optionName[i]);
}
g_execResult = false
new Float:vote_time = get_cvar_float("amx_vote_time") + 2.0
set_cvar_float("amx_last_voting", get_gametime() + vote_time)
g_voteRatio = get_cvar_float("amx_vote_ratio")
replace_all(квест,sizeof(quest)-1,"%","");
Формат(g_Answer, 127, "%s %%s", квест)
show_menu(0, ключи, menu_msg, floatround(vote_time), "голосование: ")
set_task(vote_time, "checkVotes", 99889988)
g_voteCaller = id
console_print(id, "%L", id, "VOTING_STARTED")
g_voteCount= {0, 0, 0, 0}
g_yesNoVote = 0
return PLUGIN_HANDLED
}
общественная cmdVoteKickBan(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new Float:голосование = get_cvar_float("amx_last_voting")
если (голосование > get_gametime())
{
console_print(id, "%L", id, "ALREADY_VOTING")
return PLUGIN_HANDLED
}
если (голосование && голосования + get_cvar_float("amx_vote_delay") > get_gametime())
{
console_print(id, "%L", id, "VOTING_NOT_ALLOW")
вернуть PLUGIN_HANDLED
}
new cmd[32]
read_argv(0, cmd, 31)
новый voteban = равно(cmd, "amx_voteban")
новые arg[32]
read_argv(1, arg, 31)
новый плеер = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF)
if (!плеер)
return PLUGIN_HANDLED
если (voteban && is_user_bot(плеер))
{
новые imname[32]
get_user_name(плеер, imname, 31)
console_print(id, "%L", id, "ACTION_PERFORMED", imname)
return PLUGIN_HANDLED
}
новые ключи = MENU_KEY_1|MENU_KEY_2
новые menu_msg[256], щелок[16], лно[16], lKickBan[16]
Формат(щелок, 15, "%L", LANG_SERVER, "да")
Формат(лно, 15, "%L", LANG_SERVER, "нет")
Формат(lKickBan, 15, "%L", LANG_SERVER, voteban ? "ЗАПРЕТ" : "УДАР")
ucfirst(lKickBan)
get_user_name(плеер, arg, 31)
Формат(menu_msg, 255, g_coloredMenus ? "\y%s %s?\w^n^n1. %s^n2. %s" : "%s %s?^n^n1. %s^n2. %s", lKickBan, arg, щелоков, лно)
g_yesNoVote = 1
new bool:ipban=false;
если (voteban)
{
get_user_authid(плеер, g_optionName[0], sizeof(g_optionName[])-1);
// Сделать такую же проверку, как в plmenu, чтобы определить, если это должен быть бан IP вместо
if (equal("4294967295", g_optionName[0])
|| equal("HLTV", g_optionName[0])
|| equal("STEAM_ID_LAN", g_optionName[0])
|| equali("VALVE_ID_LAN", g_optionName[0]))
{
get_user_ip(плеер, g_optionName[0], sizeof(g_optionName[])-1, 1);
ipban=true;
}
}
еще
{
num_to_str(get_user_userid(плеер), g_optionName[0], 31)
}
новые authid[32], name[32]
get_user_authid(id, authid, 31)
get_user_name(id, name, 31)
log_amx("голосование: ^"%s<%d><%s><>^" голосов %s (целевой ^"%s^")", " имя", get_user_userid(id), authid, voteban ? "ban" : "удар", arg)
новые maxpl=get_maxplayers();
new msg[256];
новые права[256];
новый манекен[1];
for (new i = 1; i <= maxpl; i++)
{
if (is_user_connected(i) && !is_user_bot(я))
{
formatex(lKickBan, charsmax(lKickBan), "%L", i, voteban ? "ЗАПРЕТ" : "УДАР");
// HACK: ADMIN_VOTE_FOR{1,2} ключи действительно странно. Маркировки и игнорировать текст до :
LookupLangKey(msg, charsmax(msg), "ADMIN_VOTE_FOR_1", i);
strtok(msg, dummy, 0, вправо, charsmax(справа), ':');
trim(right);
show_activity_id(i, id, name правой, lKickBan, arg);
}
}
g_execResult = true
new Float:vote_time = get_cvar_float("amx_vote_time") + 2.0
set_cvar_float("amx_last_voting", get_gametime() + vote_time)
g_voteRatio = get_cvar_float(voteban ? "amx_voteban_ratio" : "amx_votekick_ratio")
если (voteban)
{
если (ipban==true)
{
g_Answer = "addip 30.0 %s";
}
еще
{
g_Answer = "забаненного 30.0 %s kick";
}
}
еще
{
g_Answer = "kick #%s";
}
show_menu(0, ключи, menu_msg, floatround(vote_time), voteban ? "Запрет " : "Удар ")
set_task(vote_time, "checkVotes", 99889988)
g_voteCaller = id
console_print(id, "%L", id, "VOTING_STARTED")
g_voteCount= {0, 0, 0, 0}
return PLUGIN_HANDLED
}[/spoiler]