допустим я захожу не с админки , меняю ник на админа (ну захожу в админку) , даже когда начинается новый раунд доступа к меню этому нету , что бы доступ появился нужно менять карту или сразу заходить через админку на сервер.
- Код: Выделить всё
/*
Версия 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: первый релиз
*/
#include <amxmodx>
#include <fakemeta>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
enum
{
print_team_default = 0,
print_team_grey = -1,
print_team_red = -2,
print_team_blue = -3
};
#endif
#pragma semicolon 1
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) %1 |= (1 << (%2 & 31))
#define clr_bit(%1,%2) %1 &= ~(1 << (%2 & 31))
#define is_connected(%0) get_bit(ingame, %0)
#define is_valid_client(%0) ((0 < (%0) <= max_players) && get_bit(ingame, %0))
#define is_alive(%0) is_user_alive(%0)
const MAX_CLIENTS = 32;
const ALL = 0;
const MAX_REASONS = 6;
const NAME_LEN = 32;
const FILENAME_LEN = 64;
const MSG_LEN = 128;
const m_iMenu = 205;
const MENU_OFF = 0;
const LOAD_FLAGS_TASKID = 199960;
new max_players, ingame, isBot, isHLTV, isSteam,
user_flags[MAX_CLIENTS + 1], pl_leaved[MSG_LEN], kick_data[MAX_CLIENTS + 1],
kick_reason [MAX_REASONS + 1][MSG_LEN], kick_rule[MAX_REASONS + 1][MSG_LEN],
item_to_index[MAX_REASONS + 1],
pcv_nkm_immunity, cvar_immunity,
pcv_nkm_immunity_flags, cvar_immunity_flags,
pcv_delay_load_flags, Float: cvar_delay_load_flags;
enum menu_prop
{
BACKNAME = 0,
NEXTNAME,
EXITNAME
}
new const menu_prop_list[menu_prop][] = {
"Назад",
"Далее",
"Выход"
};
stock const CHAT_INFO_PREFIX[] = "^3[CSSURF.RU]^1";
public plugin_init()
{
register_plugin ("New Kick Menu", "0.9.4", "CSSURF.RU");
register_clcmd ("amx_kickmenu","new_kickmenu", ADMIN_KICK);
register_clcmd ("custom_kickreason", "set_custom_kickreason", ADMIN_KICK);
register_srvcmd ("amx_reloadcvars", "load_cvars");
max_players = get_maxplayers();
}
public plugin_cfg()
{
load_cvars();
new configsdir[FILENAME_LEN], file_fullname[FILENAME_LEN];
get_localinfo ("amxx_configsdir", configsdir, charsmax(configsdir));
formatex (file_fullname, charsmax(file_fullname), "%s/newkickmenu.ini", configsdir);
new file_handle = fopen(file_fullname, "rt");
if (file_handle) {
new buffer[512], keyword[MSG_LEN], msg[MSG_LEN];
while (!feof(file_handle)) {
fgets (file_handle, buffer, charsmax(buffer));
if ((buffer[0] != ';') && parse(buffer, keyword, charsmax(keyword), msg, charsmax(msg))) {
if (keyword[0] == 'R'){
if (keyword[1] == 'E') {
switch (keyword[6]) {
case '0': kick_reason[0] = msg;
case '1': kick_reason[1] = msg;
case '2': kick_reason[2] = msg;
case '3': kick_reason[3] = msg;
case '4': kick_reason[4] = msg;
case '5': kick_reason[5] = msg;
case '6': kick_reason[6] = msg;
}
}
else if (keyword[1] == 'U') {
switch(keyword[4]) {
case '1': kick_rule[1] = msg;
case '2': kick_rule[2] = msg;
case '3': kick_rule[3] = msg;
case '4': kick_rule[4] = msg;
case '5': kick_rule[5] = msg;
case '6': kick_rule[6] = msg;
}
}
}
else if (equal(keyword, "PLAYER_LEAVED")) {
pl_leaved = msg;
}
}
}
log_amx("File newkickmenu.ini loaded successfully");
fclose(file_handle);
}
else {
set_fail_state("File newkickmenu.ini loaded not properly");
}
}
public load_cvars()
{
static is_cvars_registered;
if (!is_cvars_registered) {
pcv_delay_load_flags = register_cvar ("nkm_delay_load_flags", "0.1");
pcv_nkm_immunity = register_cvar ("nkm_immunity", "1");
pcv_nkm_immunity_flags = register_cvar ("nkm_immunity_flags", "a");
is_cvars_registered = 1;
}
server_exec();
cvar_delay_load_flags = get_pcvar_float (pcv_delay_load_flags);
cvar_immunity = get_pcvar_num(pcv_nkm_immunity);
if (cvar_immunity){
new flags[24];
get_pcvar_string (pcv_nkm_immunity_flags, flags,charsmax(flags));
cvar_immunity_flags = read_flags(flags);
}
}
public client_putinserver(id)
{
clr_bit(isBot,id);
clr_bit(isHLTV,id);
clr_bit(isSteam, id);
set_bit(ingame, id);
if (is_user_bot(id)) {
set_bit(isBot,id);
}
else if (is_user_hltv(id)) {
set_bit(isHLTV,id);
}
else {
static dp_pointer;
if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider"))) {
server_cmd("dp_clientinfo %d", id);
server_exec();
if (get_pcvar_num(dp_pointer) == 2) {
set_bit(isSteam, id);
}
}
if (cvar_delay_load_flags > 0.0) {
set_task(cvar_delay_load_flags, "delayed_load_flags", id + LOAD_FLAGS_TASKID);
}
else {
user_flags[id] = get_user_flags(id);
}
}
}
public delayed_load_flags(id)
{
id -= LOAD_FLAGS_TASKID;
if (is_valid_client(id)) {
user_flags[id] = get_user_flags(id);
}
}
public client_disconnect(id)
{
clr_bit(ingame,id);
}
public new_kickmenu(id, level)
{
if (is_valid_client(id)) {
if (user_flags[id] & level) {
new nk_menu_id = menu_create ("\yКик Меню\w","new_kickmenu_handler");
new callback = menu_makecallback ("new_kickmenu_callback");
menu_setprop (nk_menu_id, MPROP_BACKNAME, menu_prop_list[BACKNAME]);
menu_setprop (nk_menu_id, MPROP_NEXTNAME, menu_prop_list[NEXTNAME]);
menu_setprop (nk_menu_id, MPROP_EXITNAME, menu_prop_list[EXITNAME]);
new data[2], name[NAME_LEN], user2;
if (!is_alive(id)){
user2 = pev(id, pev_iuser2);
if (user2 && is_valid_client(user2) && is_alive(user2)){
data[0] = user2;
get_user_name (user2, name, charsmax(name));
menu_additem (nk_menu_id, name, data, 0, callback);
}
}
for(new i = 1; i <= max_players; ++i){
if(is_connected(i) && i != user2){
data[0] = i;
get_user_name (i, name, charsmax(name));
menu_additem (nk_menu_id, name, data, 0, callback);
}
}
#if AMXX_VERSION_NUM < 183
set_pdata_int (id, m_iMenu, MENU_OFF);
#endif
menu_display (id, nk_menu_id);
}
else {
client_print_color (id, print_team_default, "%s У Вас нет доступа. Вы не Админ.", CHAT_INFO_PREFIX);
}
}
return PLUGIN_HANDLED;
}
public new_kickmenu_callback (id, menu, item)
{
static access, player, data[2], item_name[41], callback, item_status;
item_status = ITEM_ENABLED;
menu_item_getinfo (menu, item, access, data, charsmax(data), item_name, charsmax(item_name), callback);
player = data[0];
if (cvar_immunity && user_flags[player] & cvar_immunity_flags) {
add (item_name, charsmax(item_name), " \r*");
item_status = ITEM_DISABLED;
}
else if (get_bit(isBot, player)) {
add (item_name, charsmax(item_name), " \r(BOT)");
}
else if (get_bit(isHLTV, player)) {
add (item_name, charsmax(item_name), " \r(HLTV)");
item_status = ITEM_DISABLED;
}
menu_item_setname (menu, item, item_name);
return item_status;
}
public new_kickmenu_handler(id,menu,item)
{
if (item != MENU_EXIT) {
new access, data[2], item_name[MSG_LEN], callback;
menu_item_getinfo (menu, item, access, data, charsmax(data), item_name, charsmax(item_name), callback);
kick_data[id] = data[0];
if(is_valid_client(kick_data[id])){
reason_menu(id);
}
else{
client_print_color (id, print_team_default, pl_leaved);
}
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
public reason_menu(id)
{
static reason_menu_id;
if (!reason_menu_id) {
reason_menu_id = menu_create ("Выберите причину", "reason_menu_handler");
menu_setprop (reason_menu_id, MPROP_EXITNAME, menu_prop_list[EXITNAME]);
new items;
for (new i; i <= MAX_REASONS; ++i){
if (kick_reason[i][0]) {
menu_additem (reason_menu_id, kick_reason[i]);
item_to_index[items++] = i;
}
}
}
#if AMXX_VERSION_NUM < 183
set_pdata_int (id, m_iMenu, MENU_OFF);
#endif
menu_display (id, reason_menu_id);
return PLUGIN_HANDLED;
}
public reason_menu_handler (id, menu, item)
{
if (item != MENU_EXIT) {
if (item == 0) {
client_cmd(id, "messagemode custom_kickreason");
}
else {
remove_player (id, item_to_index[item]);
}
}
return PLUGIN_HANDLED;
}
public set_custom_kickreason (id, level)
{
if(user_flags[id] & level) {
read_argv (1, kick_rule[0], MSG_LEN);
remove_player (id, 0);
}
return PLUGIN_HANDLED;
}
remove_player (const admin, const reasonID)
{
if (is_valid_client(kick_data[admin])) {
new userid = get_user_userid(kick_data[admin]),
name[NAME_LEN], admin_name[NAME_LEN];
get_user_name (admin, admin_name, charsmax(admin_name));
get_user_name (kick_data[admin], name, charsmax(name));
client_print_color(ALL, print_team_default, "^x04 Админ^x03 %s^x04 Кикнул игрока^x03 %s^x04. Причина:^x03 %s", admin_name, name, (reasonID) ? kick_reason[reasonID] : kick_rule[reasonID]);
if (pev(kick_data[admin], pev_weapons) & (1<<CSW_C4)) {
engclient_cmd(kick_data[admin], "drop", "weapon_c4");
}
server_cmd("kick #%d ^"%s^"", userid, kick_rule[reasonID]);
}
else {
client_print_color (admin, print_team_default, pl_leaved);
}
}
Добавлено спустя 30 минут 33 секунды:
и если зайти с админкой и поменять ник например на другой то доступ к меню останется на картку хоть ты и не админ