Кик админов

HooLIGUN

MatchMaking CS:S / RGMIX.ru
Сообщения
1,064
Реакции
267
Здравствуйте, кто может помочь с простеньким плагином?
Нужно сделать следующие:
Плагин должен проверять, сколько админов на сервере, и если больше, чем указано в кваре, то кикать с причиной "На данном сервере достаточно админов".
То есть, если в плагине указано 3 админа, то кикать (не пускать на сервере) четвертого подключившегося админа.
Кикать админов с флагом b, используется SB
Рута (z) желательно не трогать.

Заранее спасибо :)
 

Igor

Участник
Сообщения
58
Реакции
7
Здравствуйте, кто может помочь с простеньким плагином?
Нужно сделать следующие:
Плагин должен проверять, сколько админов на сервере, и если больше, чем указано в кваре, то кикать с причиной "На данном сервере достаточно админов".
То есть, если в плагине указано 3 админа, то кикать (не пускать на сервере) четвертого подключившегося админа.
Кикать админов с флагом b, используется SB
Рута (z) желательно не трогать.

Заранее спасибо :)
эм, а можно поинтересоваться, "нафига" это надо?))
 

ludanik

Участник
Сообщения
146
Реакции
20
@Igor, очевидно же, чтобы шли администратировать другие сервера, а не сидели на одном.
 

KapaT

Эгоист
Сообщения
1,988
Реакции
535
@ludanik, дак выдай им админки на конкретные сервера, а не на все подряд.
 

ludanik

Участник
Сообщения
146
Реакции
20
@KapaT, ты видимо не уловил суть. Допустим, есть сервера микс, и вот представь, на сервере сидит 8 админов и два обычных игрока, но эти админы не хотят уходить на другие сервера ибо им тут лампово. Вопрос: что с ними будешь делать?
Один из возможных ответов в шапке.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
PHP:
#define MAX_ADMINS 3
#define ADMIN_FLAG ADMFLAG_GENERIC
#define KICK_REASON "На данном сервере достаточно админов"

public OnClientPostAdminCheck(client)
{
    if(GetUserFlagBits(client) & ADMIN_FLAG)
    {
        new iCount;     
        for (new i = 1; i <= MaxClients; i++)
        {
            if (IsClientInGame(i) && GetUserFlagBits(i) & ADMIN_FLAG)
            {
                if(iCount++ > MAX_ADMINS)
                {
                    KickClient(client, KICK_REASON);
                    break;
                }
            }
        }
    }
}
Список флагов:
PHP:
#define ADMFLAG_RESERVATION            (1<<0)        /**< Convenience macro for Admin_Reservation as a FlagBit */
#define ADMFLAG_GENERIC                (1<<1)        /**< Convenience macro for Admin_Generic as a FlagBit */
#define ADMFLAG_KICK                (1<<2)        /**< Convenience macro for Admin_Kick as a FlagBit */
#define ADMFLAG_BAN                    (1<<3)        /**< Convenience macro for Admin_Ban as a FlagBit */
#define ADMFLAG_UNBAN                (1<<4)        /**< Convenience macro for Admin_Unban as a FlagBit */
#define ADMFLAG_SLAY                (1<<5)        /**< Convenience macro for Admin_Slay as a FlagBit */
#define ADMFLAG_CHANGEMAP            (1<<6)        /**< Convenience macro for Admin_Changemap as a FlagBit */
#define ADMFLAG_CONVARS                (1<<7)        /**< Convenience macro for Admin_Convars as a FlagBit */
#define ADMFLAG_CONFIG                (1<<8)        /**< Convenience macro for Admin_Config as a FlagBit */
#define ADMFLAG_CHAT                (1<<9)        /**< Convenience macro for Admin_Chat as a FlagBit */
#define ADMFLAG_VOTE                (1<<10)        /**< Convenience macro for Admin_Vote as a FlagBit */
#define ADMFLAG_PASSWORD            (1<<11)        /**< Convenience macro for Admin_Password as a FlagBit */
#define ADMFLAG_RCON                (1<<12)        /**< Convenience macro for Admin_RCON as a FlagBit */
#define ADMFLAG_CHEATS                (1<<13)        /**< Convenience macro for Admin_Cheats as a FlagBit */
#define ADMFLAG_ROOT                (1<<14)        /**< Convenience macro for Admin_Root as a FlagBit */
#define ADMFLAG_CUSTOM1                (1<<15)        /**< Convenience macro for Admin_Custom1 as a FlagBit */
#define ADMFLAG_CUSTOM2                (1<<16)        /**< Convenience macro for Admin_Custom2 as a FlagBit */
#define ADMFLAG_CUSTOM3                (1<<17)        /**< Convenience macro for Admin_Custom3 as a FlagBit */
#define ADMFLAG_CUSTOM4                (1<<18)        /**< Convenience macro for Admin_Custom4 as a FlagBit */
#define ADMFLAG_CUSTOM5                (1<<19)        /**< Convenience macro for Admin_Custom5 as a FlagBit */
#define ADMFLAG_CUSTOM6                (1<<20)        /**< Convenience macro for Admin_Custom6 as a FlagBit */
 
Последнее редактирование:

ludanik

Участник
Сообщения
146
Реакции
20
@Danyas, сделай проверку. Кикать всех админов (с другими флагами), кроме рута (Z).
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
@Danyas, некрасиво вызывать функцию внутри цикла.
--- Добавлено позже ---

Не выполнено
В смысле, не красиво?)
Кикаю клиент, вырубаю цикл. Можно даже return вместо break.

А с чего бы не выполнено, он проверяет админов на наличие флага d, админы без этого флага идут как игроки, т.е. если у него флаг z (без флага d) - всё ок будет
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
он проверяет админов на наличие флага d, админы без этого флага идут как игроки, т.е. если у него флаг z (без флага b) - всё ок будет
Кикать админов с флагом b
Один Я чего-то не понял в реализации @Danyas? :no2:
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
В коде тоже был указан другой флаг - не опечатка.
если у него флаг z (без флага d) - всё ок будет
Флаг z включает флаг b автоматом, иначе бы игрок не опознавался сервером, как админ. Оффтоп Итого, необязательное условие действительно не выполнено.
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #13
Флаг z включает флаг b автоматом
если у него флаг z (без флага d) - всё ок будет
Флаг b = 1 << 1 = 2(dec) = 0000 0000 0010 (bin)
Флаг z = 1 << 14 = 16384(dec) = 0100 0000 0000 (bin)
А теперь выполнив битовое & получаем результат 0. Следовательно у админа с флагом z иммунитет будет.
 
Последнее редактирование:

Danyas

Участник
Сообщения
2,173
Реакции
1,072
upload_2016-11-19_14-2-15.png

PHP:
#define MAX_ADMINS 3
#define ADMIN_FLAG ADMFLAG_GENERIC
#define KICK_REASON "На данном сервере достаточно админов"

public OnClientPostAdminCheck(client)
{
if(GetUserFlagBits(client) & ADMIN_FLAG)
{
PrintToServer("%N = ADMIN_FLAG", client);

new iCount;
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i) && GetUserFlagBits(i) & ADMIN_FLAG)
{
if(iCount++ > MAX_ADMINS)
{
KickClient(client, KICK_REASON);
break;
}
}
}
}
else
{
    PrintToServer("%N = !ADMIN_FLAG", client);
}
}
--- Добавлено позже ---
Флаг z включает флаг b автоматом, иначе бы игрок не опознавался сервером, как админ.
Даже админка не открывалась. Итого, необязательное условие действительно не выполнено.
Ты не прав :biggrin:
upload_2016-11-19_14-4-35.png
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
выполнив битовое &
Побитово то да.
Флаг z включает флаг b автоматом
Сами админы пихают все флаги разом и побитово он найдётся, иммунитет исчезнет. К тому же, тогда выше предложенный код вообще не считает главного администратора (войдёт больше админов, чем указано).
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
В коде ведь побитовое сравнение, а не CheckCommandAccess.

К тому же, тогда выше предложенный код вообще не считает главного администратора (войдёт больше админов, чем указано).
Так и задумано, он же сам об этом написал.
Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
В коде ведь побитовое сравнение
Пропиши себе флаги bz и твоя "битовость" уже выходит боком. Оффтоп
он же сам об этом написал
указано 3 админа, то кикать (не пускать на сервере) четвертого подключившегося админа.
Кикать админов с флагом b
Рута (z) желательно не трогать
Не трогать для кика, но не при подсчёте.
Лично Я смотрел на твой код, как сквозь "розовые очки", для меня там был GetAdminFlag... Который и должен там быть, в принципе. Оффтоп
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Пропиши себе флаги bz и твоя "битовость" уже выходит боком. ОффтопНе трогать для кика, но не при подсчёте.
Лично Я смотрел на твой код, как сквозь "розовые очки", для меня там был GetAdminFlag... Который и должен там быть, в принципе. Оффтоп

Я понял тебя, просто сразу не вчитался)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Предлагаю оригинальную реализацию, исключительно для серверов с наличием:
[HIDE="10"]
PHP:
#define MAX_ADMINS 3

#define FLAG_IMMUNE	Admin_Root

new iAdminsCount;

public OnClientPostAdminCheck(client)
{
	if (iAdminsCount > MAX_ADMINS)
	{
		decl AdminId:AdminID;
		if ((AdminID = GetUserAdmin(client)) != INVALID_ADMIN_ID && !GetAdminFlag(AdminID, FLAG_IMMUNE) && GetAdminFlag(AdminID, Admin_Generic))
		{
			KickClient(client, "На данном сервере достаточно админов");
		}
	}
}

public OnRebuildAdminCache(AdminCachePart:part)
{
	if (part == AdminCache_Admins)
	{
		iAdminsCount = 0;
		for (new i = 1; i <= MaxClients; ++i)
		{
			if (IsClientInGame(i) && GetAdminFlag(GetUserAdmin(i), Admin_Generic)) ++iAdminsCount;
		}
	}
}
[/HIDE]MAX_ADMINS - максимальное количество исполняющих админов (в наличии флаг 'b');
FLAG_IMMUNE - флаг для иммунитета (по умолчанию Root).
Работает при ручном обновлении админов ("Обновить кеш администраторов"), так и без.
Если Я верно понял принципы SourceBans по сообщениям пользователей, то работать будет весьма оптимально при минимальном использовании памяти. Оффтоп
 

HooLIGUN

MatchMaking CS:S / RGMIX.ru
Сообщения
1,064
Реакции
267
@AlmazON, @Danyas, Спасибо ребят, буду пробовать!
На счет флагов, не соглашусь.
Флаг z не включается в себя флаг b. (по крайней мере судя по плагинам.)
Например если у меня флаг z , а иммунитет в каком либо плагине стоит на b , то на меня он (иммунитет) работать не будет., по этому, я обычно указываю для себя помимо z, еще и некоторые дополнительные (b,o,p,q) для различных плагинов\команд.

По поводу иммунитета в данной запросе:
Имеется ввиду, что я смогу зайти на сервер даже если количество админов равно квару в плагине. Напр.: на сервере 3 админа, в кваре указано MAX_ADMINS 3 , то меня, четвёртого по счету (с флагом z) пустит, а других админов с другими различными флагами - не пустит.
 
Сверху Снизу