Вопрос по AdminFlag

akvorok.ego

Участник
Сообщения
314
Реакции
186
Как можно преобразовать строковые флаги(Например: abcdf) в AdminFlag ?
Так не работает:
PHP:
        new AdminFlag:Flags;
        FindFlagByChar(ReadFlagString(sFlagsAccess), Flags);
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Последнее редактирование:

akvorok.ego

Участник
Сообщения
314
Реакции
186

akvorok.ego

Участник
Сообщения
314
Реакции
186
Это уже #define флаги. Ты уж определись.
Ну вот они:
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 */

Ну мне нужно подставить флаг(и) в битах. ReadFlagString(sFlagsAccess) не работает.

Для AddToTopMenu
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
ReadFlagString(sFlagsAccess) не работает
Я его везде использую, самая эффективная штука.
Так он же вызывается 1 раз. Оффтоп Т.е., никакой квар там смысла не имеет быть.
Просто впиши тот же #define:
C-подобный:
#define PLUGIN_FLAGS ADMFLAG_SLAY|ADMFLAG_BAN|ADMFLAG_KICK
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Конфиг подгружается далеко не в OnPluginStart(), будучи там указанным, а позже, после OnMapStart(). А вот когда меню строится - не проверял. Протестируй, наверняка в этом и есть проблема.
 

akvorok.ego

Участник
Сообщения
314
Реакции
186
Конфиг подгружается далеко не в OnPluginStart(), будучи там указанным, а позже, после OnMapStart(). А вот когда меню строится - не проверял. Протестируй, наверняка в этом и есть проблема.
Можно таймер создать на 0.3
Думаю этого хватит чтобы конфиг прочитать и записать инфу в массив.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
таймер создать на 0.3
У разного оборудования - разная скорость загрузки. Вот пример без таймера:
PHP:
new TopMenuObject:g_ObjectTop;
new Handle:cvar_AdminFlags;

public OnConfigsExecuted()
{
	static bool:bMenutop = true;
	if (bMenutop)
	{
		decl Handle:menu;
		if ((menu = GetAdminTopMenu()))
		{
			decl TopMenuObject:category;
			if ((category = FindTopMenuCategory(menu, "ServerCommands")) != INVALID_TOPMENUOBJECT)
			{
				decl String:sFlagsAccess[AdminFlags_TOTAL+1];
				GetConVarString(cvar_AdminFlags, sFlagsAccess, AdminFlags_TOTAL+1);
				g_ObjectTop = AddToTopMenu(menu, "SuperMyCategory", TopMenuObject_Item, CallBack_Category, category, "sm_testplugin", ReadFlagString(sFlagsAccess));
				bMenutop = false;
			}
		}
	}
}
 

akvorok.ego

Участник
Сообщения
314
Реакции
186
У разного оборудования - разная скорость загрузки. Вот пример без таймера:
PHP:
new TopMenuObject:g_ObjectTop;
new Handle:cvar_AdminFlags;

public OnConfigsExecuted()
{
    static bool:bMenutop = true;
    if (bMenutop)
    {
        decl Handle:menu;
        if ((menu = GetAdminTopMenu()))
        {
            decl TopMenuObject:category;
            if ((category = FindTopMenuCategory(menu, "ServerCommands")) != INVALID_TOPMENUOBJECT)
            {
                decl String:sFlagsAccess[AdminFlags_TOTAL+1];
                GetConVarString(cvar_AdminFlags, sFlagsAccess, AdminFlags_TOTAL+1);
                g_ObjectTop = AddToTopMenu(menu, "SuperMyCategory", TopMenuObject_Item, CallBack_Category, category, "sm_testplugin", ReadFlagString(sFlagsAccess));
                bMenutop = false;
            }
        }
    }
}

ReadFlagString(sFlagsAccess) всегда возвращает 0, только если стоит не z флаг.
 

akvorok.ego

Участник
Сообщения
314
Реакции
186
Прикрепи сразу свой тестовый код, как проверяешь и что делаешь.
Мап старт:
PHP:
    PrintToServer("ReadFlagString: %d", ReadFlagString(sFlagsAccess));
   
    static bool:MenuCreated;
    if(MenuCreated == false)
    {
        new Handle:topmenu;
        if(LibraryExists("adminmenu") && (topmenu = GetAdminTopMenu()) != INVALID_HANDLE) 
        {
            MenuCreated = true;
            OnAdminMenuReady(topmenu);
            PrintToServer("Menu Add");
        }
    }

PHP:
public OnAdminMenuReady(Handle:topmenu)
{
    if(topmenu != hTopMenu)
    {
        hTopMenu = topmenu;
      
        //new Flags;
        //BitToFlag(ReadFlagString(sFlagsAccess), AdminFlag:Flags);
      
        new TopMenuObject:player_weapon_blocker = FindTopMenuCategory(hTopMenu, "player_weapon_blocker");
        if(player_weapon_blocker == INVALID_TOPMENUOBJECT) player_weapon_blocker = AddToTopMenu(hTopMenu, "category_player_weapon_blocker", TopMenuObject_Category, AdminMenu_CategoryPlayerWeaponBlocker, INVALID_TOPMENUOBJECT);
      
        AddToTopMenu(hTopMenu, "player_weapon_block", TopMenuObject_Item, AdminMenu_PlayerWeaponBlock, player_weapon_blocker, "player_weapon_block", ReadFlagString(sFlagsAccess));
        AddToTopMenu(hTopMenu, "player_weapon_block_list", TopMenuObject_Item, AdminMenu_PlayerWeaponBlockList, player_weapon_blocker, "player_weapon_block_list", ReadFlagString(sFlagsAccess));
          
        //PrintToServer("Flags: %d", Flags);
    }
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
public OnAdminMenuReady(Handle:topmenu)
Ты вообще в курсе, что это самостоятельный вызов? Т.е. он вызывается "сам по себе" единожды.
if(topmenu != hTopMenu)
{
hTopMenu = topmenu;
А этим ты блокируешь все дальнейшие вызовы.
И это у тебя идёт в никуда.
 
Сверху Снизу