SB-MaterialAdmin / NewServer

New server side for SourceBans Material Admin
GNU General Public License v3.0
42 stars 26 forks source link

[Предложение] Кэширование LibraryExists() для BaseComm #116

Closed MAGNAT2645 closed 2 years ago

MAGNAT2645 commented 3 years ago

Как говорят сами разработчики SM, LibraryExists() можно считать достаточно затратной функцией. Предлагаю кэшировать библиотеку через OnLibraryAdded() и OnLibraryRemoved(), а в Native_IsClientGagged и Native_IsClientMuted проверять через глобальную bool переменную (например, g_bMA).

Итого:

#define MA_LIB "materialadmin"
bool g_bMA = false;

public void OnPluginStart() {
    g_bMA = LibraryExists( MA_LIB ); // для поддержки поздней загрузки
}

public void OnLibraryAdded(const char[] name) {
    if ( strcmp( name, MA_LIB ) == 0 )
        g_bMA = true;
}
public void OnLibraryRemoved(const char[] name) {
    if ( strcmp( name, MA_LIB ) == 0 )
        g_bMA = false;
}

public int Native_IsClientGagged(Handle hPlugin, int numParams)
{
    int iClient = GetNativeCell(1);
    if (iClient < 1 || iClient > MaxClients)
        return ThrowNativeError(SP_ERROR_NATIVE, "Invalid Client index %d", iClient);

    if (!IsClientInGame(iClient))
        return ThrowNativeError(SP_ERROR_NATIVE, "Client %d is not in game", iClient);

    if ( g_bMA ) // заменено на g_bMA
    {
        int iType = MAGetClientMuteType(iClient);
        if (iType > 1)
            g_bGagged[iClient] = true;
        else
            g_bGagged[iClient] = false;
    }

    return g_bGagged[iClient];
}
public int Native_IsClientMuted(Handle hPlugin, int numParams)
{
    int iClient = GetNativeCell(1);
    if (iClient < 1 || iClient > MaxClients)
        return ThrowNativeError(SP_ERROR_NATIVE, "Invalid Client index %d", iClient);

    if (!IsClientInGame(iClient))
        return ThrowNativeError(SP_ERROR_NATIVE, "Client %d is not in game", iClient);

    if ( g_bMA ) // заменено на g_bMA
    {
        int iType = MAGetClientMuteType(iClient);
        if (iType == 1 || iType == 3)
            g_bMuted[iClient] = true;
        else
            g_bMuted[iClient] = false;
    }

    return g_bMuted[iClient];
}
A1mDev commented 3 years ago

+1

CrazyHackGUT commented 2 years ago

Now it fixed. #127

MAGNAT2645 commented 2 years ago

Вопрос: разве здесь не нужна поддержка поздней загрузки? Если basecomm загрузить позже, то g_bMaterialAdminAvailable всегда будет false (только если materialadmin не перезагрузить вручную после этого).

public void OnPluginStart() {
    g_bMaterialAdminAvailable = LibraryExists("materialadmin");
}

Или OnLibraryAdded вызывается с каждой библиотекой для basecomm даже после поздней загрузки? :thinking:

CrazyHackGUT commented 2 years ago

Или OnLibraryAdded вызывается с каждой библиотекой для basecomm даже после поздней загрузки? 🤔

Всё верно.

MAGNAT2645 commented 2 years ago

Или OnLibraryAdded вызывается с каждой библиотекой для basecomm даже после поздней загрузки? 🤔

Всё верно.

Не знал