Русское сообщество по скриптингу

Проверка на админа / кик меню  [Решено]

Все вопросы по работе и настройке AMXX и его плагинов.

Модератор: liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по AMX Mod X и его плагинам.

Проверка на админа / кик меню

Сообщение DeIIyTaT » 16 июн 2018, 15:56

Вообщем такая проблема это кик меню
допустим я захожу не с админки , меняю ник на админа (ну захожу в админку) , даже когда начинается новый раунд доступа к меню этому нету , что бы доступ появился нужно менять карту или сразу заходить через админку на сервер.
Код: Выделить всё
/*
    Версия 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 секунды:
и если зайти с админкой и поменять ник например на другой то доступ к меню останется на картку хоть ты и не админ
Мой проект CSSURF.RU | SURF Сервера с RPG
amx-x.ru - Вы красавчики спасибо что вы есть ! :thumbs_up
Аватара пользователя
DeIIyTaT
 
Сообщения: 66
Зарегистрирован: 29 авг 2014, 13:53
Благодарил (а): 13 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
html,php

Re: Проверка на админа / кик меню

Сообщение Subb98 » 16 июн 2018, 17:42

И в чём проблема? Нужно делать реконнект, чтобы флаги доступа определились заново или использовать команду amx_reloadadmins. Это не проблема плагина, так работает AMXX.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Проверка на админа / кик меню

Сообщение DeIIyTaT » 16 июн 2018, 20:40

ну все меню работаю так ты ник сменил всё меню не открываются
а тут ты ник сменил оно еще открывает ,

Добавлено спустя 55 секунд:
кагбы ты уже не админ а плагин думает что ты админ , хотя другие плагины уже видят чтот ы не админ.
Мой проект CSSURF.RU | SURF Сервера с RPG
amx-x.ru - Вы красавчики спасибо что вы есть ! :thumbs_up
Аватара пользователя
DeIIyTaT
 
Сообщения: 66
Зарегистрирован: 29 авг 2014, 13:53
Благодарил (а): 13 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
html,php

Re: Проверка на админа / кик меню

Сообщение EpisCape » 16 июн 2018, 21:15

DeIIyTaT, потому что при подключении игрока его флаги доступа запоминаются переменной. И далее больше проверки на флаги нет, дальше идет работа с этой переменной. Сделано для оптимизации. Либо убирать такой функционал, либо при смене ника заново проверять игрока на флаги доступа.
Аватара пользователя
EpisCape
 
Сообщения: 15
Зарегистрирован: 14 май 2018, 21:47
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Языки программирования: Pawn

Re: Проверка на админа / кик меню

Сообщение DeIIyTaT » 16 июн 2018, 21:24

EpisCape писал(а):DeIIyTaT, потому что при подключении игрока его флаги доступа запоминаются переменной. И далее больше проверки на флаги нет, дальше идет работа с этой переменной. Сделано для оптимизации. Либо убирать такой функционал, либо при смене ника заново проверять игрока на флаги доступа.


либо при смене ника заново проверять игрока на флаги доступа.
как это сделать ? можете помочь?


Добавлено спустя 53 секунды:
или вообще убрать , переменную как легче
Мой проект CSSURF.RU | SURF Сервера с RPG
amx-x.ru - Вы красавчики спасибо что вы есть ! :thumbs_up
Аватара пользователя
DeIIyTaT
 
Сообщения: 66
Зарегистрирован: 29 авг 2014, 13:53
Благодарил (а): 13 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
html,php

Re: Проверка на админа / кик меню  [Решено]

Сообщение EpisCape » 16 июн 2018, 21:39

В plugin_init:
Код: Выделить всё
register_forward(FM_ClientUserInfoChanged, "fw_ClientUserInfoChanged"true);

между любыми функциями:
Код: Выделить всё
public fw_ClientUserInfoChanged(id, buffer)
{
    if(is_user_connected(id))
        user_flags[id] = get_user_flags(id);
}


Можно еще добавить чек лишь только для игроков, уже имеющих флаги, чтобы каждого смертного не проверять, в общем, дальше сами, я лишь дал пример.
Аватара пользователя
EpisCape
 
Сообщения: 15
Зарегистрирован: 14 май 2018, 21:47
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Языки программирования: Pawn

Re: Проверка на админа / кик меню

Сообщение DeIIyTaT » 16 июн 2018, 23:58

EpisCape писал(а):В plugin_init:
Код: Выделить всё
register_forward(FM_ClientUserInfoChanged, "fw_ClientUserInfoChanged", true); 

между любыми функциями:
Код: Выделить всё
public fw_ClientUserInfoChanged(id, buffer)
{
    if(is_user_connected(id))
        user_flags[id] = get_user_flags(id);


Можно еще добавить чек лишь только для игроков, уже имеющих флаги, чтобы каждого смертного не проверять, в общем, дальше сами, я лишь дал пример.


Благодарю ! Все дописал всё работает ! :-)
Мой проект CSSURF.RU | SURF Сервера с RPG
amx-x.ru - Вы красавчики спасибо что вы есть ! :thumbs_up
Аватара пользователя
DeIIyTaT
 
Сообщения: 66
Зарегистрирован: 29 авг 2014, 13:53
Благодарил (а): 13 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
html,php

Re: Проверка на админа / кик меню

Сообщение Ice_Angel » 20 июн 2018, 21:26

А что будет если в начале плагина написать?
Код: Выделить всё
 #define FLAG ADMIN_KICK   
Что будет?
Плагин "Menu + CSO Shop" готов на 30%.
Аватара пользователя
Ice_Angel
 
Сообщения: 17
Зарегистрирован: 25 апр 2016, 20:55
Откуда: Украина
Благодарил (а): 8 раз.
Поблагодарили: 0 раз.
Языки программирования: Pawn (Новичок)

Re: Проверка на админа / кик меню

Сообщение Subb98 » 22 июн 2018, 15:50

Будет объявлен макрос FLAG
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Проверка на админа / кик меню

Сообщение gamingEx » 22 июн 2018, 20:17

EpisCape писал(а):В plugin_init:
Код: Выделить всё
register_forward(FM_ClientUserInfoChanged, "fw_ClientUserInfoChanged", true);

между любыми функциями:
Код: Выделить всё
public fw_ClientUserInfoChanged(id, buffer)
{
    if(is_user_connected(id))
        user_flags[id] = get_user_flags(id);
}


Можно еще добавить чек лишь только для игроков, уже имеющих флаги, чтобы каждого смертного не проверять, в общем, дальше сами, я лишь дал пример.


Очень интересно, сколько раз срабатывает функция. Проверять бы на смену ника, что ли. ))
:dance2: :dance2: :dance2:
Аватара пользователя
gamingEx
 
Сообщения: 121
Зарегистрирован: 07 окт 2017, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 19 раз.
Опыт программирования: Больше трех лет
Языки программирования: Swift, C++, PHP, Ruby, JS

След.

Вернуться в Вопросы по AMXX и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

cron