JSON + Цвета.

Сообщения
865
Реакции
144
Помог
25 раз(а)
Здравствуйте.
Столкнулся с проблемой, что в json не хотят работать цвета меню (\r, \y, \w).
Если их напрямую использовать - плагин будет кидать ошибочные логи.
1669397180893.png
Попробовал реализовать через replace_string - результата ноль.
Сам код:
C++:
#include <AmxModX>
#include <AmxMisc>
#include <KnifeSystem>
#include <ReApi>
#include <JSON>
#include <ZombiePlague>

#define IsNullString(%0) bool:(%0[0] == EOS)

new Array:g_aKnifeData;

public plugin_init() {
    register_plugin(
        .plugin_name = "[CSO] Knife: Api",
        .version = "1.0 beta",
        .author = "ImmortalAmxx"
    );
}

public plugin_precache() {
    g_aKnifeData = ArrayCreate(eKnifeData);
    @LoadData();
}

@LoadData() {
    new szConfigsDir[MAX_CONFIG_PATH_LENGHT];
    get_localinfo("amxx_configsdir", szConfigsDir, charsmax(szConfigsDir));
    strcat(szConfigsDir, fmt("/plugins/Menu/KnifeMenu.json"), charsmax(szConfigsDir));

    if(!file_exists(szConfigsDir)) {
        set_fail_state("ModelSystem: Invalid open file: ^"%s^"", szConfigsDir);
        return;
    }

    new JSON: JSON_Handle = json_parse(szConfigsDir, true);
    if(JSON_Handle == Invalid_JSON) {
        set_fail_state("ModelSystem: Invalid read file: ^"%s^"", szConfigsDir);
        return;
    }

    new iJsonSize = json_object_get_count(JSON_Handle);
    if(!iJsonSize) {
        json_free(JSON_Handle);

        set_fail_state("ModelSystem: File ^"%s^" is empty.", szConfigsDir);
        return;
    }

    new KnifeData[eKnifeData], szBuffer[MAX_INFO_LENGTH];

    new JSON: JSON_KnifeSize = Invalid_JSON;
    new JSON: JSON_KnifeArray = Invalid_JSON;
    new iJsonFlagSize;

    for(new i = 0; i < iJsonSize; i++) {
        json_object_get_name(JSON_Handle, i, szBuffer, charsmax(szBuffer));

        if(IsNullString(szBuffer) || szBuffer[0] == '#') {
            continue;
        }

        if(equali(szBuffer, "knifes")) {
            JSON_KnifeSize = json_object_get_value(JSON_Handle, szBuffer);

            if(JSON_KnifeSize == Invalid_JSON) {
                continue;
            }

            iJsonFlagSize = json_array_get_count(JSON_KnifeSize);

            replace_string(szBuffer, charsmax(szBuffer), "!r", "\r");
            replace_string(szBuffer, charsmax(szBuffer), "!w", "\w");
            replace_string(szBuffer, charsmax(szBuffer), "!y", "\y");

            for(new j = 0; j < iJsonFlagSize; j++) {
                JSON_KnifeArray = json_array_get_value(JSON_KnifeSize, j);
                if(JSON_KnifeArray != Invalid_JSON) {
                    if(json_object_has_value(JSON_KnifeArray, "name", JSONString)) {
                        json_object_get_string(JSON_KnifeArray, "name", KnifeData[NAME], PLATFORM_MAX_PATH - 1);
                    }   

                    if(json_object_has_value(JSON_KnifeArray, "viewmodel", JSONString)) {
                        json_object_get_string(JSON_KnifeArray, "viewmodel", KnifeData[MODELS][MODEL_V], PLATFORM_MAX_PATH - 1);

                        if(file_exists(KnifeData[MODELS][MODEL_V])) {
                            precache_model(KnifeData[MODELS][MODEL_V]);
                        }
                        else {
                            log_amx("No Model Found: %s", KnifeData[MODELS][MODEL_V]);
                        }
                    }

                    if(json_object_has_value(JSON_KnifeArray, "playermodel", JSONString)) {
                        json_object_get_string(JSON_KnifeArray, "playermodel", KnifeData[MODELS][MODEL_P], PLATFORM_MAX_PATH - 1);

                        if(file_exists(KnifeData[MODELS][MODEL_P])) {
                            precache_model(KnifeData[MODELS][MODEL_P]);
                        }
                        else {
                            log_amx("No Model Found: %s", KnifeData[MODEL_P]);
                        }
                    }

                    if(json_object_has_value(JSON_KnifeArray, "flag", JSONString)) {
                        json_object_get_string(JSON_KnifeArray, "flag", KnifeData[ACCESS], PLATFORM_MAX_PATH - 1);
                    }

                    if(json_object_has_value(JSON_KnifeArray, "damage", JSONNumber)) {
                        KnifeData[ATTRIB][DAMAGE] = json_object_get_real(JSON_KnifeArray, "damage")
                    }
                    else KnifeData[ATTRIB][DAMAGE] = 1.0;

                    if(json_object_has_value(JSON_KnifeArray, "speed", JSONNumber)) {
                        KnifeData[ATTRIB][SPEED] = json_object_get_real(JSON_KnifeArray, "speed")
                    }
                    else KnifeData[ATTRIB][SPEED] = 280.0;

                    if(json_object_has_value(JSON_KnifeArray, "gravity", JSONNumber)) {
                        KnifeData[ATTRIB][GRAVITY] = json_object_get_real(JSON_KnifeArray, "gravity")
                    }
                    else KnifeData[ATTRIB][GRAVITY] = 1.0;                                   

                    ArrayPushArray(g_aKnifeData, KnifeData);
                }
                json_free(JSON_KnifeArray);
            }
        }
    }
    json_free(JSON_Handle);
}

public plugin_natives() {
    register_native("amxx_get_knife_info", "@Native_GetKnifeInfo");
    register_native("amxx_get_knife_arraysize", "@Native_GetArraySize");
}

@Native_GetKnifeInfo(iPlugin, iParam) {
    enum {
        arg_key = 1,
        arg_array
    }

    new iKey = get_param(arg_key), aData[eKnifeData];

    ArrayGetArray(g_aKnifeData, iKey, aData);
    return set_array(arg_array, aData, eKnifeData);
}

@Native_GetArraySize(iPlugin, iParam) {
    return ArraySize(g_aKnifeData);
}
Цвета просто не считывает.
Кто знает, что может быть не так?
 
Сообщения
658
Реакции
230
Помог
11 раз(а)
проверь сначало на коректность JSON Online Validator and Formatter - JSON Lint

у тебя начинает ругаться на;
Код:
 new JSON: JSON_Handle = json_parse(szConfigsDir, true);
    if(JSON_Handle == Invalid_JSON) {
        set_fail_state("ModelSystem: Invalid read file: ^"%s^"", szConfigsDir);
        return;
    }
кинь сам json сюда
 
Сообщения
865
Реакции
144
Помог
25 раз(а)
Limbooc, ошибка именно идет тогда, когда использую \w, \y, при \r все хорошо. Именно по этому и пробовал делать через replcae, с ним проблем нет, но цвета всё равно не считывает.
 
Сообщения
91
Реакции
141
Помог
1 раз(а)
Столкнулся с проблемой, что в json не хотят работать цвета меню (\r, \y, \w).
\\r \\y \\w только сработает
или можешь использовать с помощью replace, в json файле цвета заносить с помощью ! (!r !y !w) и затем при парсе, делаешь replace на \r \y \w и заносишь в свой массив
 

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

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