Не работает лимит использования

Ganter1234

Участник
Сообщения
1,149
Реакции
667
У меня не работает лимит использование команды, всю информацию он вроде получает, но не работает и не отключает команду
...:
#include <sourcemod>

#pragma semicolon 1

public Plugin myinfo =
{
    name        =     "Command Limiter",
    author      =     "Ganter1234",
    version     =     "1.0"
};

new Limit[MAXPLAYERS+1];
int NumLimit;

public void OnPluginStart()
{
    Config();
    HookEvent("round_start", OnRoundStart, EventHookMode_PostNoCopy);
    RegAdminCmd("sm_reload_limiter", Reload, ADMFLAG_ROOT);
}

public Action Reload(int iClient, int iArgs)
{
    Config();
    PrintToChat(iClient, "[CL] Конфиг перезагружен");
}

void Config()
{
    KeyValues Kv = new KeyValues("Command_Limiter");    // Создание конфига
    
    char sBuffer[256];
    BuildPath(Path_SM, sBuffer, sizeof(sBuffer), "configs/command_limiter.cfg");
    if (!FileToKeyValues(Kv, sBuffer)) SetFailState("Файл конфигурации не найден %s", sBuffer);

    if (Kv.GotoFirstSubKey())
    {
        do
        {
            if (Kv.GetSectionName(sBuffer, sizeof(sBuffer)))
            {
                AddCommandListener(Check, sBuffer); // Находим команду в конфиге
                NumLimit = Kv.GetNum(sBuffer); // Получаем число с команды
            }
        }
        while (Kv.GotoNextKey());
    }
    delete Kv;
}

public OnRoundStart(Handle:event, const String:name[], bool:donBroadcast) // Сбрасываем счетчик
{
    for (new i = 1; i <= MaxClients; i++)
    {
        Limit[i] = 0;
    }
}

public Action Check(int iClient, const char[] sCommand, int iArgc)    // Что делать с командой
{
    if(iClient != 0 && Limit[iClient] >= NumLimit)
    {
        PrintToChat(iClient, "[CL] Вы достилги лимита использования команды!");
        return Plugin_Stop;
    }
    else
    {
        Limit[iClient]++;
    }
    return Plugin_Continue;
}
 
Решение
Вообщем, решил я проблему созданием конвара, немного костыльно но ладно, потом подумаю как сделать по человечески.
Сообщения автоматически склеены:

@Ganter1234, Сначала узнай, работает ли у тебя callback и если не работает, то исправляй, а потом уже все остальное делай, условия, конфиги, массивы и тд
Потом проверю

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Без понятия, попробуй может быть Plugin_Handled, а не Plugin_Stop.
 

dvernoff

Добрая душа
Сообщения
638
Реакции
591
У меня не работает лимит использование команды, всю информацию он вроде получает, но не работает и не отключает команду
...:
#include <sourcemod>

#pragma semicolon 1

public Plugin myinfo =
{
    name        =     "Command Limiter",
    author      =     "Ganter1234",
    version     =     "1.0"
};

new Limit[MAXPLAYERS+1];
int NumLimit;

public void OnPluginStart()
{
    Config();
    HookEvent("round_start", OnRoundStart, EventHookMode_PostNoCopy);
    RegAdminCmd("sm_reload_limiter", Reload, ADMFLAG_ROOT);
}

public Action Reload(int iClient, int iArgs)
{
    Config();
    PrintToChat(iClient, "[CL] Конфиг перезагружен");
}

void Config()
{
    KeyValues Kv = new KeyValues("Command_Limiter");    // Создание конфига
  
    char sBuffer[256];
    BuildPath(Path_SM, sBuffer, sizeof(sBuffer), "configs/command_limiter.cfg");
    if (!FileToKeyValues(Kv, sBuffer)) SetFailState("Файл конфигурации не найден %s", sBuffer);

    if (Kv.GotoFirstSubKey())
    {
        do
        {
            if (Kv.GetSectionName(sBuffer, sizeof(sBuffer)))
            {
                AddCommandListener(Check, sBuffer); // Находим команду в конфиге
                NumLimit = Kv.GetNum(sBuffer); // Получаем число с команды
            }
        }
        while (Kv.GotoNextKey());
    }
    delete Kv;
}

public OnRoundStart(Handle:event, const String:name[], bool:donBroadcast) // Сбрасываем счетчик
{
    for (new i = 1; i <= MaxClients; i++)
    {
        Limit[i] = 0;
    }
}

public Action Check(int iClient, const char[] sCommand, int iArgc)    // Что делать с командой
{
    if(iClient != 0 && Limit[iClient] >= NumLimit)
    {
        PrintToChat(iClient, "[CL] Вы достилги лимита использования команды!");
        return Plugin_Stop;
    }
    else
    {
        Limit[iClient]++;
    }
    return Plugin_Continue;
}
Сначало узнай где сама проблема, методом дебага
C-подобный:
public Action Check(int iClient, const char[] sCommand, int iArgc)    // Что делать с командой
{
   PrintToChatAll("debug: limit client: %i, numlimit: %i", Limit[iClient], NumLimit);
    if(iClient != 0 && Limit[iClient] >= NumLimit)
    {
        PrintToChat(iClient, "[CL] Вы достилги лимита использования команды!");
        return Plugin_Stop;
    }
    else
    {
        Limit[iClient]++;
    }
    return Plugin_Continue;
}
что выведет в чат?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #4
Ну тут проблема, на самом деле, очевидна.

Команд у Вас в конфиге видимо несколько предполагается, а переменная под лимит всего одна. Вам нужно в хеш мапу писать лимит так же, и в какой-нибудь массив - кол-во применений той или иной команды.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
а при перезагрузке конфига разве не нужно делать RemoveCommandListener() перед новыми AddCommandListener()?
 

Ganter1234

Участник
Сообщения
1,149
Реакции
667
Без понятия, попробуй может быть Plugin_Handled, а не Plugin_Stop.
Попробовал, не помогло
Сначало узнай где сама проблема, методом дебага
C-подобный:
public Action Check(int iClient, const char[] sCommand, int iArgc)    // Что делать с командой
{
   PrintToChatAll("debug: limit client: %i, numlimit: %i", Limit[iClient], NumLimit);
    if(iClient != 0 && Limit[iClient] >= NumLimit)
    {
        PrintToChat(iClient, "[CL] Вы достилги лимита использования команды!");
        return Plugin_Stop;
    }
    else
    {
        Limit[iClient]++;
    }
    return Plugin_Continue;
}
что выведет в чат?
Ничего не выводит в чат
Ну тут проблема, на самом деле, очевидна.

Команд у Вас в конфиге видимо несколько предполагается, а переменная под лимит всего одна. Вам нужно в хеш мапу писать лимит так же, и в какой-нибудь массив - кол-во применений той или иной команды.
Вроде бы я все сделал верно, я же получаю инфу о том какая цифра прописана в конфиге, но она ничего не делает и "Вам нужно в хеш мапу писать лимит так же, и в какой-нибудь массив - кол-во применений той или иной команды." Как мне это сделать?
а при перезагрузке конфига разве не нужно делать RemoveCommandListener() перед новыми AddCommandListener()?
Сделал
 

Fleeeshi

Добрая душа
Сообщения
231
Реакции
202
@Ganter1234, Сначала узнай, работает ли у тебя callback и если не работает, то исправляй, а потом уже все остальное делай, условия, конфиги, массивы и тд
 

Ganter1234

Участник
Сообщения
1,149
Реакции
667
Вообщем, решил я проблему созданием конвара, немного костыльно но ладно, потом подумаю как сделать по человечески.
Сообщения автоматически склеены:

@Ganter1234, Сначала узнай, работает ли у тебя callback и если не работает, то исправляй, а потом уже все остальное делай, условия, конфиги, массивы и тд
Потом проверю
 
Решение

Ganter1234

Участник
Сообщения
1,149
Реакции
667
и как ты это сделал?
Вангую, что никак.
1620829374724.png
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Ganter1234, ты должен удалять хук команд перед добавлением новых, ты же делаешь в этом коде наоборот.
Кроме того плагин не знает какие команды были, т.к. ты удаляешь KeyValues (из которых плагин мог бы знать какие команды ловятся) сразу после чтения конфига.
Ну и KeyValues у тебя локальные, а ты удаляешь хук вне зоны, где их можно было прочитать.

В общем ты всё неправильно сделал.
Ждём новой темы про утечки памяти и тормозами/лагами на сервере.
 

Ganter1234

Участник
Сообщения
1,149
Реакции
667
@Ganter1234, ты должен удалять хук команд перед добавлением новых, ты же делаешь в этом коде наоборот.
Кроме того плагин не знает какие команды были, т.к. ты удаляешь KeyValues (из которых плагин мог бы знать какие команды ловятся) сразу после чтения конфига.
Ну и KeyValues у тебя локальные, а ты удаляешь хук вне зоны, где их можно было прочитать.

В общем ты всё неправильно сделал.
Ждём новой темы про утечки памяти и тормозами/лагами на сервере.
Учту
 
Сверху Снизу