Иконка ресурса

ReAmxBhop 0.1.0

Нет прав для скачивания
Сообщения
3,569
Реакции
1,560
Помог
133 раз(а)
b0t., по коду всё хорошо, но есть несколько моментов, чтобы довести его до идеала
:smile3:

  1. Вместо feof можно сразу использовать fgets. Пример.


  2. Код:
    szData,szLeft,charsmax(szLeft),szRight,charsmax(szRight),'=');
    trim(szLeft);
    trim(szRight);
    Вместо этого можно использовать strtok2.
    Параметр trim.
    Код:
    /** * Breaks a string in two by token.
    *
    * @note Only available in 1.8.3 and above.
    *
    * @param text String to tokenize
    * @param left Buffer to store left half
    * @param llen Size of left buffer
    * @param right Buffer to store right half
    * @param rlen Size of right buffer
    * @param token Token to split by
    * @param trim Flags for trimming behavior, see above
    *
    * @return Returns position of token in string if found,
    * -1 if token was not found
    */
    native strtok2(const text[], left[], const llen, right[], const rlen, const token = ' ', const trim = 0);
    Флаги для аргумента trim из string_const.inc:
    Код:
    /** * Below are the trim flags for strtok2
    *
    * You can specify how the left and right buffers will
    * be trimmed by strtok2. LTRIM trims spaces from the
    * left side. RTRIM trims from the right side.
    *
    * The defines TRIM_INNER, TRIM_OUTER and TRIM_FULL are
    * shorthands for commonly used flag combinations.
    *
    * When the initial string is trimmed, using TRIM_INNER
    * for all subsequent strtok2 calls will ensure that left
    * and right are always trimmed from both sides.
    *
    * Examples:
    * str1[] = " This is * some text "
    * strtok2(str1, left, 24, right, 24, '*', TRIM_FULL)
    * left will be "This is", right will be "some text"
    *
    * str2[] = " Here is | an | example "
    * trim(str2)
    * strtok2(str2, left, 24, right, 24, '|', TRIM_INNER)
    * left will be "Here is", right will be "an | example"
    * strtok2(right, left, 24, right, 24, '|', TRIM_INNER)
    * left will be "an", right will be "example"
    *
    * str3[] = " One - more "
    * strtok2(str3, left, 24, right, 24, '-', TRIM_OUTER)
    * left will be "One ", right will be " more"
    *
    * str4[] = " Final . example "
    * strtok2(str4, left, 24, right, 24, '.', LTRIM_LEFT|LTRIM_RIGHT)
    * left will be "Final ", right will be "example "
    */
    #define LTRIM_LEFT (1<<0)
    #define RTRIM_LEFT (1<<1)
    #define LTRIM_RIGHT (1<<2)
    #define RTRIM_RIGHT (1<<3)
    
    #define TRIM_INNER RTRIM_LEFT|LTRIM_RIGHT
    #define TRIM_OUTER LTRIM_LEFT|RTRIM_RIGHT
    #define TRIM_FULL TRIM_OUTER|TRIM_INNER

  3. А вообще в целом, почему бы не использовать готовый инструмент от amxx для парсинга? textparse_ini.inc. Пример.

  4. Не очень удобным решением с точки зрения пользователя считаю создание конфига автоматически. Вместо того чтобы сконфигурировать
    плагин как надо, и просто установить его, пользователь должен сначала его установить, дождаться смены карты (если речь идёт о сервере с хорошим онлайном), затем сконфигурировать его, опять подождать смену карты, и затем уже плагин будет работать как ему надо.

  5. Вроде как дурным тоном считается хардкодить пути до папки configs, и предлагается использовать get_configsdir.
 
Последнее редактирование:
  • Нравится
Реакции: b0t.
Сообщения
3,569
Реакции
1,560
Помог
133 раз(а)
b0t., ну так да, можно класть готовый кфг в архив, но у тебя его не было.

Насчёт папки configs, потому что её расположение (и других стандартных директорий) пользователь может изменить. Глянь конфиг
configs/core.ini.
 
Сообщения
3,569
Реакции
1,560
Помог
133 раз(а)
Код:
public bool:Func__ReadFile(INIParser:handle,const szKey[],const szValue[]) {
    if(strncmp(szKey,"cl_cmd",true) == 0) {
        register_clcmd(szValue,"Show__BhopMenu");
        register_clcmd(fmt("say /%s",szValue),"Show__BhopMenu");
        register_clcmd(fmt("say_team /%s",szValue),"Show__BhopMenu");

        return true;
    }

    if(strncmp(szKey,"bhop_access",true) == 0) {
        g_iBitFlagAccess_Bhop = read_flags(szValue);

        return true;
    }

    if(strncmp(szKey,"accelerator_access",true) == 0) {
        g_iBitFlagAccess_Accelerator = read_flags(szValue);

        return true;
    }

    return false;
}
b0t., я наверное не очень удачный пример привёл, либо ты не дочитал документацию к INI_SetReaders: дело в том, что return false останавливает дальнейший парсинг.
Код:
@return                 True to keep parsing, false otherwise.
В моём примере мне так и надо, т.е. если нашёл совпадение по названию текущей карты, дальше уже не надо парсить.
В твоём же случае, как я понял, ты используешь return при поиске конкретных ключей в конфиге. И если в начало файла вдруг случайно попадёт другой символ, парсинг вообще остановится, и значения не будут считаны.
Иными словами, у тебя везде должно быть return true.
 
Сообщения
397
Реакции
221
Помог
13 раз(а)
Nordic Warrior, да, я уже прочитал всё.
В этом плагине не стал изменять или, что-то редактировать, т.к. все нужные значения я получаю.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу