• Гость, перед открытием темы прочитай описание раздела, чтобы не ошибиться. Любые вопросы по настройке сервера создаются в разделе Технической Поддержки.

Решено get_user_flags

98richard98

Участник
Сообщения
50
Симпатии
2
Баллы
64
Возраст
26
#1
Столкнулся с проблемой функции get_user_flags.
В случаях с
get_user_flags(id)&ADMIN_ALL
get_user_flags(id)&ADMIN_ADMIN
постоянно возвращает 0, хотя в 1-м случае функция вообще всегда должна возвращать 1.

Код:
public plugin_init()
{
register_plugin("test plugin","1.0","Richard98")
register_clcmd("say /test","test_go")
return PLUGIN_CONTINUE
}

public test_go(id)
{
if(get_user_flags(id)&ADMIN_ALL)
{
console_print(id,"admin_all")
client_print(id,print_chat,"admin_all")
}
if(get_user_flags(id)&ADMIN_ADMIN)
{
console_print(id,"admin_admin")
client_print(id,print_chat,"admin_admin")
}
if(get_user_flags(id)&ADMIN_USER)
{
console_print(id,"admin_user")
client_print(id,print_chat,"admin_user")
}
if(get_user_flags(id)&ADMIN_RCON)
{
console_print(id,"admin_rcon")
client_print(id,print_chat,"admin_rcon")
}
if(get_user_flags(id)&ADMIN_KICK)
{
console_print(id,"admin_kick")
client_print(id,print_chat,"admin_kick")
}

return PLUGIN_HANDLED
}

Результат выполнения:
Для админа с полным доступом:
admin_rcon
admin_kick

Для простого игрока:
admin_user


Ожидаемые результаты:
Для админа с полным доступом:
admin_all
admin_admin
admin_rcon
admin_kick

Для простого игрока:
admin_all
admin_user
 
Последнее редактирование модератором:

3BEPb

Участник
Сообщения
143
Симпатии
49
Баллы
109
#2
Скажи лучше, что ты хочешь в обще добиться, а не то, что пытаешься сделать.
 

98richard98

Участник
Сообщения
50
Симпатии
2
Баллы
64
Возраст
26
#3
Хочу сделать в плагине проверку на админа вне зависимости от его флагов. Хотя можно сделать !(get_user_flags(id)&ADMIN_USER) но и то, что делаю я, по идее должно работать.
 

lddnsk

Администратор
Сообщения
254
Симпатии
65
Баллы
104
#5
Хочу сделать в плагине проверку на админа вне зависимости от его флагов. Хотя можно сделать !(get_user_flags(id)&ADMIN_USER) но и то, что делаю я, по идее должно работать.
В каком смысле "вне зависимости от флагов"? Все перечисленные дифайны в amxmisc.inc - это флаги. Вернее, флаги юзеров - это перечисленные дифайны. Даже функция дословно переводится как "получить флаги пользователя".
Ты пытаешься завести машину ключом зажигания независимо от свечей зажигания.
То есть, ты изначально ставишь неправильную задачу, решения которой нет.
Либо же я чего-то не пойму.

Напиши хотя бы рядышком с результатом проверки права, выданные проверяемому юзеру. Для наглядности.
 

98richard98

Участник
Сообщения
50
Симпатии
2
Баллы
64
Возраст
26
#6
Значит не так делаешь, тебе нужно это
Хорошая идея. Спасибо

В каком смысле "вне зависимости от флагов"? Все перечисленные дифайны в amxmisc.inc - это флаги. Вернее, флаги юзеров - это перечисленные дифайны. Даже функция дословно переводится как "получить флаги пользователя".
Ты пытаешься завести машину ключом зажигания независимо от свечей зажигания.
То есть, ты изначально ставишь неправильную задачу, решения которой нет.
Либо же я чего-то не пойму.

Напиши хотя бы рядышком с результатом проверки права, выданные проверяемому юзеру. Для наглядности.
Результат выполнения:
Для админа с полным доступом: (abcdefghijklmnopqrstu)
admin_rcon
admin_kick

Для простого игрока: (z)
admin_user


Судя по документации мой вариант тоже должен работать:
ADMIN_ALL //Everyone
ADMIN_IMMUNITY //Flag "a", immunity
ADMIN_RESERVATION //Flag "b", reservation
ADMIN_KICK //Flag "c", kick
ADMIN_BAN //Flag "d", ban
ADMIN_SLAY //Flag "e", slay
ADMIN_MAP //Flag "f", map change
ADMIN_CVAR //Flag "g", cvar change
ADMIN_CFG //Flag "h", config execution
ADMIN_CHAT //Flag "i", chat
ADMIN_VOTE //Flag "j", vote
ADMIN_PASSWORD //Flag "k", sv_password
ADMIN_RCON //Flag "l", rcon access
ADMIN_LEVEL_A //Flag "m", custom
ADMIN_LEVEL_B //Flag "n", custom
ADMIN_LEVEL_C //Flag "o", custom
ADMIN_LEVEL_D //Flag "p", custom
ADMIN_LEVEL_E //Flag "q", custom
ADMIN_LEVEL_F //Flag "r", custom
ADMIN_LEVEL_G //Flag "s", custom
ADMIN_LEVEL_H //Flag "t", custom
ADMIN_MENU //Flag "u", menus
ADMIN_ADMIN //Flag "y", default admin
ADMIN_USER //Flag "z", default user

Но
ADMIN_ALL
ADMIN_ADMIN
не работают.
 

lddnsk

Администратор
Сообщения
254
Симпатии
65
Баллы
104
#7
Хорошая идея. Спасибо



Результат выполнения:
Для админа с полным доступом: (abcdefghijklmnopqrstu)
admin_rcon
admin_kick

Для простого игрока: (z)
admin_user


Судя по документации мой вариант тоже должен работать:
ADMIN_ALL //Everyone
ADMIN_IMMUNITY //Flag "a", immunity
ADMIN_RESERVATION //Flag "b", reservation
ADMIN_KICK //Flag "c", kick
ADMIN_BAN //Flag "d", ban
ADMIN_SLAY //Flag "e", slay
ADMIN_MAP //Flag "f", map change
ADMIN_CVAR //Flag "g", cvar change
ADMIN_CFG //Flag "h", config execution
ADMIN_CHAT //Flag "i", chat
ADMIN_VOTE //Flag "j", vote
ADMIN_PASSWORD //Flag "k", sv_password
ADMIN_RCON //Flag "l", rcon access
ADMIN_LEVEL_A //Flag "m", custom
ADMIN_LEVEL_B //Flag "n", custom
ADMIN_LEVEL_C //Flag "o", custom
ADMIN_LEVEL_D //Flag "p", custom
ADMIN_LEVEL_E //Flag "q", custom
ADMIN_LEVEL_F //Flag "r", custom
ADMIN_LEVEL_G //Flag "s", custom
ADMIN_LEVEL_H //Flag "t", custom
ADMIN_MENU //Flag "u", menus
ADMIN_ADMIN //Flag "y", default admin
ADMIN_USER //Flag "z", default user

Но
ADMIN_ALL
ADMIN_ADMIN
не работают.
Какой же это полный доступ, если "y" нету? Это и есть твой admin_admin. После этого и admin_all получишь
 

98richard98

Участник
Сообщения
50
Симпатии
2
Баллы
64
Возраст
26
#8
Y не прописывают админам. Он выдаётся системой автоматически всем, у есть какой-либо флаг.
 

98richard98

Участник
Сообщения
50
Симпатии
2
Баллы
64
Возраст
26
#9
Ладно смотрим описание:
ADMIN_ADMIN //Flag "y", default admin - перевод "обычный админ", т.е. просто админ.
ADMIN_ALL //Everyone т.е. КАЖДЫЙ

Предположим что ADMIN_ADMIN не вызывается из-за отсутствия флага "y", но почему тогда ADMIN_ALL выдаёт 0, когда на абсолютно любого она должна выдавать 1?
 

3BEPb

Участник
Сообщения
143
Симпатии
49
Баллы
109
#10
Хватило бы и лайка.
Ладно смотрим описание:
ADMIN_ADMIN //Flag "y", default admin - перевод "обычный админ", т.е. просто админ.
ADMIN_ALL //Everyone т.е. КАЖДЫЙ

Предположим что ADMIN_ADMIN не вызывается из-за отсутствия флага "y", но почему тогда ADMIN_ALL выдаёт 0, когда на абсолютно любого она должна выдавать 1?
Вообще непонятны твои предположения и догадки о работе кода, если пытаешься в чём то разобраться, дак изучи вопрос, как можно подробно, а не глянув поверхностно первый попавшийся источник.
#define ADMIN_ALL 0 /* everyone */
#define ADMIN_IMMUNITY (1<<0) /* flag "a" */
#define ADMIN_RESERVATION (1<<1) /* flag "b" */
#define ADMIN_KICK (1<<2) /* flag "c" */
#define ADMIN_BAN (1<<3) /* flag "d" */
#define ADMIN_SLAY (1<<4) /* flag "e" */
#define ADMIN_MAP (1<<5) /* flag "f" */
#define ADMIN_CVAR (1<<6) /* flag "g" */
#define ADMIN_CFG (1<<7) /* flag "h" */
#define ADMIN_CHAT (1<<8) /* flag "i" */
#define ADMIN_VOTE (1<<9) /* flag "j" */
#define ADMIN_PASSWORD (1<<10) /* flag "k" */
#define ADMIN_RCON (1<<11) /* flag "l" */
#define ADMIN_LEVEL_A (1<<12) /* flag "m" */
#define ADMIN_LEVEL_B (1<<13) /* flag "n" */
#define ADMIN_LEVEL_C (1<<14) /* flag "o" */
#define ADMIN_LEVEL_D (1<<15) /* flag "p" */
#define ADMIN_LEVEL_E (1<<16) /* flag "q" */
#define ADMIN_LEVEL_F (1<<17) /* flag "r" */
#define ADMIN_LEVEL_G (1<<18) /* flag "s" */
#define ADMIN_LEVEL_H (1<<19) /* flag "t" */
#define ADMIN_MENU (1<<20) /* flag "u" */
#define ADMIN_ADMIN (1<<24) /* flag "y" */
#define ADMIN_USER (1<<25) /* flag "z" */
 

lddnsk

Администратор
Сообщения
254
Симпатии
65
Баллы
104
#11
Y не прописывают админам. Он выдаётся системой автоматически всем, у есть какой-либо флаг.
Много лет никому права не выдавал, может ты и прав конечно. Но в списке amx_who я не видел, чтобы кому-то сервер с правами "сам" выдал этот флаг - нет ни у админов, ни у игроков.

В конце концов, что тебе мешает проверить?

Ладно смотрим описание:
ADMIN_ADMIN //Flag "y", default admin - перевод "обычный админ", т.е. просто админ.
ADMIN_ALL //Everyone т.е. КАЖДЫЙ

Предположим что ADMIN_ADMIN не вызывается из-за отсутствия флага "y", но почему тогда ADMIN_ALL выдаёт 0, когда на абсолютно любого она должна выдавать 1?
Моя мысль была в следующем: если "Y" появится, то ALL заработает просто из той логики, что ВСЕ права будут выданы, до единого.
Ты не думал в таком направлении? All в перводе означает "все". Everyone может означать не только любой, но и "каждый" - каждый флаг без исключения, то есть все флаги сразу.

Это теория, на истину я не претендую. Как уже говорил, слишком давно я с этими правами не сталкивался, память стирает то, чем не пользуешься подолгу... но кто тебе мешает экспериментировать? Или лучше сидеть и ждать погоды у моря, пока само все решится?
 

3BEPb

Участник
Сообщения
143
Симпатии
49
Баллы
109
#12
Моя мысль была в следующем: если "Y" появится, то ALL заработает просто из той логики, что ВСЕ права будут выданы, до единого.
Ты не думал в таком направлении? All в перводе означает "все". Everyone может означать не только любой, но и "каждый" - каждый флаг без исключения, то есть все флаги сразу.

Это теория, на истину я не претендую. Как уже говорил, слишком давно я с этими правами не сталкивался, память стирает то, чем не пользуешься подолгу... но кто тебе мешает экспериментировать? Или лучше сидеть и ждать погоды у моря, пока само все решится?
Идея хорошая, но ни верная. В данном случае ALL означает для всех, а не все флаги.
 

lddnsk

Администратор
Сообщения
254
Симпатии
65
Баллы
104
#13

lddnsk

Администратор
Сообщения
254
Симпатии
65
Баллы
104
#14
Из любопытства решил затестить. ADMIN_ALL действительно работает по другому принципу. А вот добавление "y" к правам работает так, как я и говорил - admin_admin выводится.
 

98richard98

Участник
Сообщения
50
Симпатии
2
Баллы
64
Возраст
26
#15
Хех, поставил)
Из любопытства решил затестить. ADMIN_ALL действительно работает по другому принципу. А вот добавление "y" к правам работает так, как я и говорил - admin_admin выводится.
Пару лет назад я работал с ADMIN_ALL и он работал как надо, правда через #define.

Касательно "y": он никому не выдаётся по-хорошему и нигде не отображается. Но все команды в cmdaccess.ini, которым присвоен флаг "y", доступны каждому админу, вне его доступа. Именно поэтому я считаю, что ADMIN_ADMIN должен работать так, как я считаю. Ну конечно с истиной спорить невозможно.
 

lddnsk

Администратор
Сообщения
254
Симпатии
65
Баллы
104
#16
98richard98, обрати внимание на данный кусок кода:
C++:
stock cmd_access(id, level, cid, num, bool:accesssilent = false)
{
    new has_access = 0;
    if ( id==(is_dedicated_server()?0:1) )
    {
        has_access = 1;
    }
    else if ( level==ADMIN_ADMIN )
    {
        if ( is_user_admin(id) )
        {
            has_access = 1;
        }
    }
    else if ( get_user_flags(id) & level )
    {
        has_access = 1;
    }
    else if (level == ADMIN_ALL)
    {
        has_access = 1;
    }
    ###...

именно с фунцией cmd_access работают плагины, которые имеют функции с правами "y" по умолчанию.
флага ADMIN_ALL нет. условия пишутся сами под него. и бит у него нулевой.
в отличие от ADMIN_ADMIN, для которого все же вручную можно выставить флаг и немного обмануть систему.

другими словами, чтобы все работало как ты говоришь по типу "само должно выставлять права", тебе нужно работать именно с этой функцией. ничто другое не выставит права "само"
 
Последнее редактирование:

98richard98

Участник
Сообщения
50
Симпатии
2
Баллы
64
Возраст
26
#17
98richard98, обрати внимание на данный кусок кода:
C++:
stock cmd_access(id, level, cid, num, bool:accesssilent = false)
{
    new has_access = 0;
    if ( id==(is_dedicated_server()?0:1) )
    {
        has_access = 1;
    }
    else if ( level==ADMIN_ADMIN )
    {
        if ( is_user_admin(id) )
        {
            has_access = 1;
        }
    }
    else if ( get_user_flags(id) & level )
    {
        has_access = 1;
    }
    else if (level == ADMIN_ALL)
    {
        has_access = 1;
    }
    ###...

именно с фунцией cmd_access работают плагины, которые имеют функции с правами "y" по умолчанию.
флага ADMIN_ALL нет. условия пишутся сами под него. и бит у него нулевой.
в отличие от ADMIN_ADMIN, для которого все же вручную можно выставить флаг и немного обмануть систему.

другими словами, чтобы все работало как ты говоришь по типу "само должно выставлять права", тебе нужно работать именно с этой функцией. ничто другое не выставит права "само"
Библиотека. Теперь всё ясно. Спасибо.
 
Сверху