New Kick Menu

amxx New Kick Menu 1.2.8

Нет прав для скачивания
Для CS 1.6
Автор
Radius
Исходный код
#define PLUGIN "New Kick Menu"
#define VERSION "1.2.8"
#define AUTHOR "Radius"

// Раскоментировать если на сервере установлен плагин Admin Loader версии 1.5 и выше от neygomon
//#define ADMIN_LOADER_INTEGRATION

#define MAX_CLIENTS 32
#define ML_DICTIONARY "newkickmenu.txt"
#define CONFIG_FILE "newkickmenu.cfg"
#define USE_DELAYED_LOAD_FLAGS
#define USE_COLORCHAT
#define USE_CSTRIKE_PDATAS
#define USE_REGEX

#include <amxmodx>
#include <stocks>

/*
Список изменений:

Версия 1.2.8 (1 июня 2016г):
- добавлена консольная команда nkm_add_reason, которая добавляет причину, соответствующее ей правило и команду наказания
- удален new_kick_menu.ini, так как загрузка причин осуществляется через new_kick_menu.cfg
- удален квар nkm_warning_punishment_cmd, так как его функциональность заменила консольная команда nkm_add_reason
- добавлен квар nkm_warning_hud_msg_pos, который задает x и y координаты предупредительного HUD сообшения
- добавлено автоматическое создание конфигурационного файла new_kick_menu.cfg для кваров, если он не существует
- квар nkm_warning_sound теперь содержит путь к файлу звука, который будет проигрываться игроку при выдаче предупреждения
- добавлена возможность компиляции плагина в режиме интеграции (#define ADMIN_LOADER_INTEGRATION) с плагином Admin Loader версии 1.5 и выше от neygomon с целью получения флагов доступа через предоставляемое API
- удален квар auth_delay_load_flags, так как вызывает слишком много вопросов

Версия 1.2 (15 марта 2016г):
- добавлен квар nkm_warning_hud_msg, который определяет будет ли показываться HUD сообщение при выдаче предупреждения
- добавлен квар nkm_warning_sound, который определяет будет ли проигрываться звук при выдаче предупреждения
- добавлен квар nkm_warning_punishment_cmd, который позволяет назначить свое наказание за превышение максимального числа предупреждений
- добавлена функция native new_kick_menu_display(id), которая позволяет встраивать в свои скрипты вызов нового Kick меню
- добавлена возможность выбора нескольких игроков для применения наказания
- добавлена возможность расставлять переносы строк для сообщений чата в конфигурационных файлах (*.ini, *.cfg, *.txt) и исходном коде

Версия 1.1.5 (1 февраля 2016г):
- добавлен квар nkm_warning_hud_msg_color, который задает цвет предупредительного HUD сообшения
- добавлен квар nkm_log_type, который настраивает куда будут писаться логи. 0 - в стандартный лог AMX Mod X, 1 - в папку newkickmenu
- добавлен квар nkm_high_access_flags, который задает флаги доступа необходимые для возможности кикать и выдавать предупреждения игрокам с иммунитетом
- квар nkm_menu_access_flags, переименован в nkm_access_flags (смысл не изменился, так как ничего кроме меню в плагине нет)
- добавлен конфигурационный файл newkickmenu.cfg, в котором можно задать значения кваров и прочитать описания к ним

Версия 1.1 (30 декабря 2015г):
- добавлена поддержка многоязычности ("addons/amxmodx/data/lang/new_kick_menu.txt")
- добавлена возможность выдавать предупреждения

Версия 1.0.1 (23 ноября 2015г):
- добавлена возможность игрокам с правами ADMIN_RCON (флаг "L"), кикать игроков с иммунитетом

Версия 1.0 (8 сентября 2015г):
- переделан конфиг newkickmenu.ini и код его загрузки, для поддержки большого количества причин и правил
- добавлен квар nkm_menu_access_flags "c", который задает флаги доступа к меню кика
- удален квар nkm_immunity, его функциональность добавлена в nkm_immunity_flags
- переименован квар nkm_delay_load_flags в auth_delay_load_flags
- исправлены недочеты форматирования при листании меню
- к правилу при кике добавляется имя админа, чтобы игрок точно сказал кто из админов его наказал
- добавлено логирование кика, для возможности решения спорных ситуаций и контроля за админами

Версия 0.9.4 (22 апреля 2015г):
- возможность задать задержку загрузки флагов доступа (квар nkm_delay_load_flags)
- реорганизация кода

Версия 0.9.3 (16 ноября 2014г):
- полный переход на версию AMX ModX 1.8.3, на версиях 1.8.2 и ниже работа не гарантируется
- добавлена возможность писать свою причину админам, у которых стоит защита на CS (протектор)
- плагин завершает работу если файл newkickmenu.ini был загружен некорретно. Если загрузка прошла успешно, будет соответствующая запись об этом в логах AMX Mod X

Версия 0.9.2 (13 мая 2014г):
- плагин теперь работает без словаря, причины и правила считываются из newkickmenu.ini
- добавлена поддержка colorchat
- добавлена возможность быстро кикать игрока, за которым в данный момент наблюдает админ. Он будет первым в списке. Также удобно если игрок быстро меняет ники, можно быть уверенным что это именно он
- HLTV получил иммунитет

Версия 0.9.1:
- если у игрока есть бомба, он ее выкидывает и уже потом кикается

Версия 0.9.0: первый релиз
*/

#define is_has_access(%0) (user_flags[%0] & access_flags == access_flags)
#define is_has_high_access(%0) (user_flags[%0] & high_access_flags == high_access_flags)
#define is_has_immunity(%0) (user_flags[%0] & immunity_flags == immunity_flags)

const MAX_REASONS = 32;
const REASON_LEN = 128;

new const CFG_ADDITIONAL_TEXT[][] =
{
"// Формат команды: nkm_add_reason ^"текст причины^" ^"текст правила^" [^"команды для наказания^"]^n",
"// ^"команда для наказания^" - необязательный параметр, отвечающий за то, будет ли применяться указанное наказание при выдаче предупреждения или нет^n",
"nkm_add_reason ^"Неадекват^" ^"Неадекватное поведение^" ^"amx_slap %userid% 5^"^n",
"nkm_add_reason ^"Мониторинг^" ^"Запрещено мониторить^"^n",
"nkm_add_reason ^"АФК^" ^"Вы стояли без движения слишком долго^"^n",
"nkm_add_reason ^"Нуб | Ламер^" ^"Сервер не для новичков^"^n",
"nkm_add_reason ^"Кемпер^" ^"Необходимо выполнять задание карты^"^n",
"nkm_add_reason ^"Лагер^" ^"Вы лагаете, настройте интернет и закройте лишние приложения^"^n",
"nkm_add_reason ^"Реклама | Флуд | Спам^" ^"Запрещены флуд, спам, реклама^"^n^n"
};

enum kick_data_map
{
KD_INDEX,
KD_USER_DEFINED_REASON[REASON_LEN]
}

new kick_reasons_num;
new kick_menu_cid;
new kick_reason_mid[MAX_CLIENTS + 1];
new access_flags , high_access_flags, immunity_flags;
new p_nkm_max_warnings , nkm_max_warnings;
new p_nkm_log_type , nkm_log_type;
new p_nkm_warning_hud_msg , nkm_warning_hud_msg;
new p_nkm_warning_sound , nkm_warning_sound[CVAR_LEN];
new hud_color[3];
new Float: hud_msg_pos[3];
new nkm_log_filename[FILENAME_LEN];
new kick_data [MAX_CLIENTS + 1][kick_data_map];
new warnings_num [MAX_CLIENTS + 1];
new item_to_selected_player[MAX_CLIENTS + 1][MAX_CLIENTS];
new selected_players[MAX_CLIENTS + 1][MAX_CLIENTS + 1];
new kick_reason [MAX_REASONS][REASON_LEN];
new kick_rule [MAX_REASONS][REASON_LEN];
new kick_punish_cmd [MAX_REASONS][CMD_LEN];

init_plugin()
{
register_clcmd ("amx_kickmenu" , "clcmd_amx_kickmenu");
register_clcmd ("custom_kickreason", "set_custom_kickreason");
register_srvcmd ("nkm_add_reason" , "srvcmd_nkm_add_reason");
kick_menu_cid = menu_makecallback ("kick_menu_callback");
copy(kick_reason[kick_reasons_num++], charsmax(kick_reason[]), "NKM_USER_DEFINED_REASON");

for (new i; i < sizeof CFG_ADDITIONAL_TEXT; i++) {
add_to_cfg(CFG_ADDITIONAL_TEXT);
}
}

public plugin_cfg()
{
exec_cfg_file(CONFIG_FILE, nkm_log_type ? nkm_log_filename : "");
load_cvars();

if (nkm_log_type) {
new full_path[FILENAME_LEN];
if (create_amxx_subfolder("amxx_logs", "newkickmenu", full_path, charsmax(full_path))) {
new date_year, date_month, date_day;
date(date_year, date_month, date_day);
formatex(nkm_log_filename, charsmax(nkm_log_filename), "%s/L%d%02d%02d.log", full_path, date_year, date_month, date_day);
}
else {
log_amx("Error opening ^"%s^" folder", full_path);
pause("ad");
return;
}
}
}

init_cvars()
{
//задержка загрузки флагов доступа (пригодится если долго загружаются из базы данных)
auth_delay_load_flags = 1.0;
p_nkm_max_warnings = register_cvar_ex ("nkm_max_warnings" , "3" , _, _, "лимит предупреждений после превышения которого игрок будет автоматически удален с сервера");
p_nkm_log_type = register_cvar_ex ("nkm_log_type" , "1" , _, _, "куда будут писаться логи:^n// 0 - в стандартный лог AMX Mod X ^"addons/amxmodx/logs^"^n// 1 - в подпапку ^"addons/amxmodx/logs/newkickmenu^"");
p_nkm_warning_hud_msg = register_cvar_ex ("nkm_warning_hud_msg" , "1" , _, _, "показывать (1) или не показывать (0) HUD сообщение при выдаче предупреждения");
p_nkm_warning_sound = register_cvar_ex ("nkm_warning_sound" , "events/friend_died" , _, _, "звук, который будет проигрываться игроку при выдаче предупреждения^n// Если квар пустой, то звук не проигрывается");
register_cvar_ex ("nkm_warning_hud_msg_pos" , "-1.0 0.36" , _, _, "x и y координаты HUD сообщения, которое показывается при выдаче предупреждения");
register_cvar_ex ("nkm_warning_hud_msg_color" , "255 75 75" , _, _, "RGB цвет HUD сообщения, которое показывается при выдаче предупреждения. Порядок: Красный Зеленый Синий");
register_cvar_ex ("nkm_access_flags" , "c" , _, _, "флаги доступа необходимые для использовая кик меню");
register_cvar_ex ("nkm_high_access_flags" , "l" , _, _, "флаги доступа необходимые для возможности кикать и выдавать предупреждения игрокам с иммунитетом");
register_cvar_ex ("nkm_immunity_flags" , "a" , _, _, "флаги иммунитета от действий админа^n// Внимание: от действий админов с правами указанными в кваре nkm_high_access_flags иммунитета нет");
}

load_cvars()
{
server_exec();
nkm_max_warnings = get_pcvar_num(p_nkm_max_warnings);
nkm_log_type = get_pcvar_num(p_nkm_log_type);
nkm_warning_hud_msg = get_pcvar_num(p_nkm_warning_hud_msg);

immunity_flags = clamp(cvar_to_flags("nkm_immunity_flags"), ADMIN_IMMUNITY, ADMIN_ADMIN);
access_flags = clamp(cvar_to_flags("nkm_access_flags"), ADMIN_IMMUNITY, ADMIN_ADMIN);
high_access_flags = clamp(cvar_to_flags("nkm_high_access_flags"), ADMIN_IMMUNITY, ADMIN_ADMIN);

get_pcvar_string(p_nkm_warning_sound, nkm_warning_sound, charsmax(nkm_warning_sound));
cvar_to_colors("nkm_warning_hud_msg_color", hud_color[R_COLOR], hud_color[G_COLOR], hud_color[B_COLOR]);
cvar_to_coord("nkm_warning_hud_msg_pos", hud_msg_pos);
}

public client_putinserver(id)
{
set_bit(ingame, id);

if (is_user_hltv(id)) {
set_bit(is_hltv, id);
}
else {
players_num++;

if (is_user_bot(id)) {
set_bit(is_bot, id);
}
}

#if !defined ADMIN_LOADER_INTEGRATION
load_user_flags(id);
#endif
}

public client_load_flags(id, flags)
{
user_flags[id] = flags;
}

public client_disconnect(id)
{
if (is_connected(id)) {
if (kick_reason_mid[id]) {
menu_destroy(kick_reason_mid[id]);
kick_reason_mid[id] = 0;
}

if (!get_bit(is_hltv, id)) {
players_num--;
}

clr_bit(is_bot,id);
clr_bit(is_hltv,id);
warnings_num[id] = 0;
clr_bit(ingame, id);
}
}

new_kick_menu(id)
{
if (!is_valid_client(id)) {
return PH;
}

if (!is_has_access(id)) {
client_print_color (id, print_team_default, FMT_ML, id, "NKM_NO_ACCESS");
return PH;
}

if (players_num < 2) {
client_print_color (id, print_team_default, FMT_ML, id, "NKM_NOT_ENOUGH_PLAYERS");
return PH;
}

new nk_mid = menu_create (get_ml_string(id, "NKM_KICK_MENU_TITLE"),"kick_menu_handler");

menu_setprop (nk_mid, MPROP_BACKNAME, get_ml_string(id, "NKM_MENU_BACKWARD"));
menu_setprop (nk_mid, MPROP_NEXTNAME, get_ml_string(id, "NKM_MENU_FORWARD"));
menu_setprop (nk_mid, MPROP_EXITNAME, get_ml_string(id, "NKM_MENU_EXIT"));

new observer_target, item;

if (!is_user_alive(id)) {
observer_target = get_observer(id);

if (observer_target && is_user_alive(observer_target)) {
item_to_selected_player[id][item++] = observer_target;
menu_additem (nk_mid, "iem_name", .callback = kick_menu_cid);
}
}

for (new i = 1; i <= max_players; ++i) {
if (is_connected(i) && i != id && !get_bit(is_hltv, i) && i != observer_target) {
item_to_selected_player[id][item++] = i;
menu_additem (nk_mid, "iem_name", .callback = kick_menu_cid);
}
}

menu_display_ex (id, nk_mid);
return PH;
}

public kick_menu_callback (id, menu, item)
{
item_status = ITEM_ENABLED;
selected_player = item_to_selected_player[id][item];
get_user_name (selected_player, user_name[selected_player], charsmax(user_name[]));

if (!is_has_high_access(id) && is_has_immunity(selected_player)) {
formatex (item_name, charsmax(item_name), "%s \r*", user_name[selected_player]);
item_status = ITEM_DISABLED;
}
else if (get_bit(is_bot, selected_player)) {
formatex (item_name, charsmax(item_name), "%s \r(BOT)", user_name[selected_player]);
}
else {
copy (item_name, charsmax(item_name), user_name[selected_player]);
}

if (selected_players[id][selected_player]) {
add(item_name, charsmax(item_name), "\r[\y+\r]");
}

menu_item_setname (menu, item, item_name);
return item_status;
}

public kick_menu_handler(id, menu, item)
{
if (item != MENU_EXIT) {
selected_player = item_to_selected_player[id][item];

if (is_valid_client(selected_player)) {
if (!is_player_selected(id, selected_player)) {
set_player_selected(id, selected_player);
}
else {
set_player_unselected(id, selected_player);
}

if (kick_data[id][KD_INDEX] != -1) {
confirm_action_menu(id);
}
else {
kick_reason_menu(id);
}
}
else{
client_print_color (id, print_team_default, FMT_ML, id, "NKM_PLAYER_NOT_INGAME");
}
}

menu_destroy(menu);
return PH;
}

kick_reason_menu(id)
{
if (!is_valid_client(id)) {
return PH;
}

if (!kick_reason_mid[id]) {
kick_reason_mid[id] = menu_create (get_ml_string(id, "NKM_KICK_REASON_MENU_TITLE"), "kick_reason_menu_handler");

menu_setprop (kick_reason_mid[id], MPROP_BACKNAME, get_ml_string(id, "NKM_MENU_BACKWARD"));
menu_setprop (kick_reason_mid[id], MPROP_NEXTNAME, get_ml_string(id, "NKM_MENU_FORWARD"));
menu_setprop (kick_reason_mid[id], MPROP_EXITNAME, get_ml_string(id, "NKM_MENU_EXIT"));

for (new i; i < kick_reasons_num; ++i) {
if (GetLangTransKey(kick_reason) == TransKey_Bad) {
menu_additem (kick_reason_mid[id], kick_reason);
}
else {
menu_additem (kick_reason_mid[id], get_ml_string(id, kick_reason));
}
}
}

menu_display_ex (id, kick_reason_mid[id]);
return PH;
}

public kick_reason_menu_handler (id, menu, item)
{
if (item != MENU_EXIT) {
kick_data[id][KD_INDEX] = item;

if (item == 0) {
client_cmd(id, "messagemode custom_kickreason");
}
else {
confirm_action_menu(id);
}
}

return PH;
}

confirm_action_menu(id)
{
if (!is_valid_client(id)) {
return PH;
}

new confirm_action_mid = menu_create (get_ml_string(id, "NKM_CONFIRM_ACTION_MENU_TITLE"), "confirm_action_menu_handler");
menu_setprop (confirm_action_mid, MPROP_EXITNAME, get_ml_string(id, "NKM_MENU_EXIT"));

new selected_players_num, pos;

for (new i = 1; i <= max_players; i++) {
if (selected_players[id]) {
get_user_name(i, user_name, charsmax(user_name[]));

if (++selected_players_num == 1) {
pos = formatex(item_name, charsmax(item_name), FMT_ML, id, "NKM_CONFIRM_ACTION_MENU_PLAYER", user_name);
}
else {
pos += formatex(item_name[pos], charsmax(item_name) - pos, ", %s", user_name);
}
}
}

if (!pos) {
new_kick_menu(id);
return PH;
}

menu_additem (confirm_action_mid, item_name);

if (kick_data[id][KD_INDEX] > 0){
if (GetLangTransKey(kick_reason[kick_data[id][KD_INDEX]]) == TransKey_Bad) {
formatex(item_name, charsmax(item_name), FMT_ML, id, "NKM_CONFIRM_ACTION_MENU_REASON", kick_reason[kick_data[id][KD_INDEX]]);
}
else {
formatex(item_name, charsmax(item_name), FMT_ML, id, "NKM_CONFIRM_ACTION_MENU_REASON", get_ml_string(id, kick_reason[kick_data[id][KD_INDEX]]));
}
}
else {
formatex(item_name, charsmax(item_name), FMT_ML, id, "NKM_CONFIRM_ACTION_MENU_REASON", kick_data[id][KD_USER_DEFINED_REASON]);
}

menu_additem (confirm_action_mid, item_name);
menu_additem (confirm_action_mid, get_ml_string(id, "NKM_CONFIRM_ACTION_MENU_KICK"));
menu_additem (confirm_action_mid, get_ml_string(id, "NKM_CONFIRM_ACTION_MENU_WARN"));

menu_display_ex (id, confirm_action_mid);
return PH;
}

public confirm_action_menu_handler (id, menu, item)
{
if (item != MENU_EXIT) {
switch (item) {
case 0: new_kick_menu(id);
case 1: kick_reason_menu(id);
case 2: punish_selected_players(id, .warning_only = 0);
case 3: punish_selected_players(id, .warning_only = 1);
}
}

menu_destroy(menu);
return PH;
}

punish_selected_players (admin, warning_only = 0)
{
static reason[REASON_LEN], rule[REASON_LEN], log_msg[512], victims_names[NAME_LEN * 7];

new victims_names_pos;
new kd_index = kick_data[admin][KD_INDEX];

if (kd_index > 0) {
copy(reason, charsmax(reason), kick_reason[kd_index]);
copy(rule, charsmax(rule), kick_rule[kd_index]);
}
else {
copy(reason, charsmax(reason), kick_data[admin][KD_USER_DEFINED_REASON]);
copy(rule, charsmax(rule), kick_data[admin][KD_USER_DEFINED_REASON]);
}

new is_ml_reason = (GetLangTransKey(reason) != TransKey_Bad);
new is_ml_rule = (GetLangTransKey(rule) != TransKey_Bad);

for (new victim = 1; victim <= max_players; victim++) {
if (!selected_players[admin][victim]) {
continue;
}

if (!is_valid_client(victim)) {
client_print_color (admin, print_team_default, FMT_ML, admin, "NKM_PLAYER_NOT_INGAME");
return;
}

get_user_name (admin, user_name[admin], charsmax(user_name[]));
get_user_authid (admin, user_steamid[admin], charsmax(user_steamid[]));
get_user_ip(admin, user_ip[admin], charsmax(user_ip[]), 1);

get_user_name (victim, user_name[victim], charsmax(user_name[]));
get_user_authid (victim, user_steamid[victim], charsmax(user_steamid[]));
get_user_ip(victim, user_ip[victim], charsmax(user_ip[]), 1);

new victim_userid = get_user_userid(victim);

if (warning_only && ++warnings_num[victim] <= nkm_max_warnings) {
if (is_ml_reason) {
formatex(log_msg, charsmax(log_msg), "Warning: ^"%s<%s><%s>^" warned ^"%s<%s><%s>^" (reason ^"%L^")", user_name[admin], user_steamid[admin], user_ip[admin], user_name[victim], user_steamid[victim], user_ip[victim], LANG_SERVER, reason);
}
else {
formatex(log_msg, charsmax(log_msg), "Warning: ^"%s<%s><%s>^" warned ^"%s<%s><%s>^" (reason ^"%s^")", user_name[admin], user_steamid[admin], user_ip[admin], user_name[victim], user_steamid[victim], user_ip[victim], reason);
}

nkm_log(log_msg);

if (nkm_warning_hud_msg) {
set_hudmessage (hud_color[R_COLOR], hud_color[G_COLOR], hud_color[B_COLOR], hud_msg_pos[X], hud_msg_pos[Y], 0, 0.0, 10.0, 0.1, 3.0);

if (is_ml_rule) {
show_hudmessage (victim, "%L %L", victim, "NKM_WARNING_HUD_MSG", warnings_num[victim], nkm_max_warnings, user_name[admin], victim, rule);
}
else {
show_hudmessage (victim, "%L %s", victim, "NKM_WARNING_HUD_MSG", warnings_num[victim], nkm_max_warnings, user_name[admin], rule);
}
}

if (!is_str_empty(nkm_warning_sound)) {
client_cmd(victim, SPK_TEMPLATE, nkm_warning_sound);
}

if (!is_str_empty(kick_punish_cmd[kd_index])) {
punish_player(victim, kd_index, reason, is_ml_reason);
}
}
else {
if (pev(victim, pev_weapons) & (1<<CSW_C4)) {
engclient_cmd(victim, "drop", "weapon_c4");
}

if (is_ml_reason) {
formatex(log_msg, charsmax(log_msg), "Kick: ^"%s<%s><%s>^" kick ^"%s<%s><%s>^" (reason ^"%L^")", user_name[admin], user_steamid[admin], user_ip[admin], user_name[victim], user_steamid[victim], user_ip[victim], LANG_SERVER, reason);
}
else {
formatex(log_msg, charsmax(log_msg), "Kick: ^"%s<%s><%s>^" kick ^"%s<%s><%s>^" (reason ^"%s^")", user_name[admin], user_steamid[admin], user_ip[admin], user_name[victim], user_steamid[victim], user_ip[victim], reason);
}

nkm_log(log_msg);

if (is_ml_rule) {
server_cmd("kick #%d %L (%s)", victim_userid, victim, rule, user_name[admin]);
}
else {
server_cmd("kick #%d %s (%s)", victim_userid, rule, user_name[admin]);
}
}

if (victims_names_pos == 0) {
victims_names_pos += formatex (victims_names[victims_names_pos], charsmax(victims_names) - victims_names_pos, "%s", user_name[victim]);
}
else {
victims_names_pos += formatex (victims_names[victims_names_pos], charsmax(victims_names) - victims_names_pos, ", %s", user_name[victim]);
}

selected_players[admin][victim] = 0;
}

if (is_ml_reason) {
if (warning_only) {
client_print_color(ALL, print_team_default, "%L %L", LANG_PLAYER, "NKM_WARNING_CHAT_MSG", user_name[admin], victims_names, LANG_PLAYER, reason);
}
else {
client_print_color(ALL, print_team_default, "%L %L", LANG_PLAYER, "NKM_KICK_CHAT_MSG", user_name[admin], victims_names, LANG_PLAYER, reason);
}
}
else {
if (warning_only) {
client_print_color(ALL, print_team_default, "%L %s", LANG_PLAYER, "NKM_WARNING_CHAT_MSG", user_name[admin], victims_names, reason);
}
else {
client_print_color(ALL, print_team_default, "%L %s", LANG_PLAYER, "NKM_KICK_CHAT_MSG", user_name[admin], victims_names, reason);
}
}

kick_data[admin][KD_INDEX] = -1;
}

punish_player(victim, punish_cmd_index, const reason[], is_ml_reason)
{
static punish_cmd[CMD_LEN], userid_str[32];
copy (punish_cmd, charsmax(punish_cmd), kick_punish_cmd[punish_cmd_index]);

if (containi(punish_cmd, "%userid%") != -1) {
formatex(userid_str, charsmax(userid_str), "#%i", get_user_userid(victim));
replace_string(punish_cmd, charsmax(punish_cmd), "%userid%", userid_str);
}

if (containi(punish_cmd, "%authid%") != -1) {
replace_string(punish_cmd, charsmax(punish_cmd), "%authid%", user_steamid[victim]);
}

if (containi(punish_cmd, "%name%") != -1) {
replace_string(punish_cmd, charsmax(punish_cmd), "%name%", user_name[victim]);
}

if (containi(punish_cmd, "%ip%") != -1) {
replace_string(punish_cmd, charsmax(punish_cmd), "%ip%", user_ip[victim]);
}

if (containi(punish_cmd, "%reason%") != -1) {
if (is_ml_reason) {
replace_string(punish_cmd, charsmax(punish_cmd), "%reason%", get_ml_string(LANG_SERVER, reason));
}
else {
replace_string(punish_cmd, charsmax(punish_cmd), "%reason%", reason);
}
}

if (containi(punish_cmd, "kick") != -1 || containi(punish_cmd, "ban") != -1) {
if (pev(victim, pev_weapons) & (1 << CSW_C4)) {
engclient_cmd(victim, "drop", "weapon_c4");
}
}

server_cmd(punish_cmd);
}

bool: is_player_selected(id, selected_player)
{
for (new i = 1; i <= max_players; i++) {
if (selected_players[id] && i == selected_player) {
return true;
}
}

return false;
}

set_player_unselected(id, selected_player)
{
for (new i = 1; i <= max_players; i++) {
if (selected_players[id] && i == selected_player) {
selected_players[id] = 0;
break;
}
}
}

public plugin_natives()
{
register_native("new_kick_menu_display", "_new_kick_menu_display", 1);
}

nkm_log(const log_msg[])
{
switch (nkm_log_type) {
case 1: log_to_file(nkm_log_filename, log_msg);
default: log_amx(log_msg);
}
}

public _new_kick_menu_display(id)
{
kick_data[id][KD_INDEX] = -1;
arrayset(selected_players[id], 0, sizeof selected_players[]);
return new_kick_menu(id);
}

public clcmd_amx_kickmenu(id)
{
kick_data[id][KD_INDEX] = -1;
arrayset(selected_players[id], 0, sizeof selected_players[]);
return new_kick_menu(id);
}

public set_custom_kickreason (id)
{
if (!is_has_access(id)) {
return PH;
}

new cmd_arg_string[CMD_LEN];

if (get_argv(1, cmd_arg_string, charsmax(cmd_arg_string))) {
copy(kick_data[id][KD_USER_DEFINED_REASON], REASON_LEN -1, cmd_arg_string);
}
else {
formatex(kick_data[id][KD_USER_DEFINED_REASON], REASON_LEN -1, FMT_ML, LANG_SERVER, "NKM_NOT_DEFINED_REASON");
}

confirm_action_menu(id);
return PH;
}

public srvcmd_nkm_add_reason(id)
{
if (kick_reasons_num >= sizeof kick_reason) {
return PH;
}

new cmd_arg_string[REASON_LEN];

if (!get_argv(1, cmd_arg_string, charsmax(cmd_arg_string))) {
server_print("empty");
return PH;
}

copy(kick_reason[kick_reasons_num], charsmax(kick_reason[]), cmd_arg_string);

if (!get_argv(2, cmd_arg_string, charsmax(cmd_arg_string))) {
(_debug || id) && console_print(id, "Kick Reason should have a pair Kick Rule");
return PH;
}

copy(kick_rule[kick_reasons_num], charsmax(kick_rule[]), cmd_arg_string);

if (!get_argv(3, cmd_arg_string, charsmax(cmd_arg_string))) {
(_debug || id) && console_print(id, "Executing server command: nkm_add_reason ^"%s^" ^"%s^"", kick_reason[kick_reasons_num], kick_rule[kick_reasons_num]);
kick_reasons_num++;
return PH;
}

copy(kick_punish_cmd[kick_reasons_num], charsmax(kick_punish_cmd[]), cmd_arg_string);
(_debug || id) && console_print(id, "Executing server command: nkm_add_reason ^"%s^" ^"%s^" ^"%s^"", kick_reason[kick_reasons_num], kick_rule[kick_reasons_num], kick_punish_cmd[kick_reasons_num]);
kick_reasons_num++;
return PH;
}
Требование ReAPI
Нет
Поддержка русского языка
Да
Совместимость
  1. HLDS
  2. REHLDS
Сверху Снизу