Выдача моделей.

Сообщения
863
Реакции
144
Помог
25 раз(а)
Здравствуйте.
Решил для себя сделать меню выдачи моделей так, что бы не конфликтовало с другими плагинами (аля вип меню и так далее).
Так вот, вопрос. Будет ли целесообразно сделать следующим образом?
Выдавать так называемый "ключ" (аля уникальное название) через trie, и потом выдавать игроку var_impulse? Или же, можно как-то по другому сделать?
Что то на подобии такого:
C++:
#include <AmxModX>
#include <ReApi>
#include <ModelApi>
#include <JSON>

new Array:g_aModelData, Trie:g_tModelId;

public plugin_init() {
    register_plugin(
        .plugin_name = "[1.9.0] Weapon Models: API",
        .version = "1.0.0 beta",
        .author = "ImmortalAmxx"
    );
}

public plugin_precache() {
    g_aModelData = ArrayCreate(eModelData);
    g_tModelId = TrieCreate();
    @LoadJson();
}

@LoadJson() {
    new szConfigsDir[256];
    get_localinfo("amxx_configsdir", szConfigsDir, charsmax(szConfigsDir));
    strcat(szConfigsDir, fmt("/plugins/ModelsApi.json"), charsmax(szConfigsDir));

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

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

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

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

    new ModelData[eModelData], szBuffer[256];

    new JSON: JSON_ModelSize = Invalid_JSON;
    new JSON: JSON_ModelArray = Invalid_JSON;
    new iJsonModelSize;

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

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

        if(equali(szBuffer, "model_list")) {
            JSON_ModelSize = json_object_get_value(JSON_Handle, szBuffer);

            if(JSON_ModelSize == Invalid_JSON) {
                continue;
            }

            iJsonModelSize = json_array_get_count(JSON_ModelSize);

            for(new j = 0; j < iJsonModelSize; j++) {
                JSON_ModelArray = json_array_get_value(JSON_ModelSize, j);
                if(JSON_ModelArray != Invalid_JSON) {
                    if(json_object_has_value(JSON_ModelArray, "key", JSONString)) {
                        json_object_get_string(JSON_ModelArray, "key", ModelData[CMD], PLATFORM_MAX_PATH - 1);
                    }

                    if(json_object_has_value(JSON_ModelArray, "model_v", JSONString)) {
                        json_object_get_string(JSON_ModelArray, "model_v", ModelData[MODEL_V], PLATFORM_MAX_PATH - 1);

                        if(file_exists(ModelData[MODEL_V]))    {
                            precache_model(ModelData[MODEL_V]);
                        }
                        else {
                            log_amx("File Not Exist: %s", ModelData[MODEL_V]);
                        }                           
                    }

                    if(json_object_has_value(JSON_ModelArray, "model_p", JSONString)) {
                        json_object_get_string(JSON_ModelArray, "model_p", ModelData[MODEL_P], PLATFORM_MAX_PATH - 1);

                        if(file_exists(ModelData[MODEL_P]))    {
                            precache_model(ModelData[MODEL_P]);
                        }
                        else {
                            log_amx("File Not Exist: %s", ModelData[MODEL_P]);
                        }                       
                    }

                     if(json_object_has_value(JSON_ModelArray, "model_w", JSONString)) {
                        json_object_get_string(JSON_ModelArray, "model_w", ModelData[MODEL_W], PLATFORM_MAX_PATH - 1);

                        if(file_exists(ModelData[MODEL_W]))    {
                            precache_model(ModelData[MODEL_W]);
                        }
                        else {
                            log_amx("File Not Exist: %s", ModelData[MODEL_W]);
                        }
                    }
                                                                          
                    TrieSetCell(g_tModelId, ModelData[CMD], ArrayPushArray(g_aModelData, ModelData));
                }
                json_free(JSON_ModelArray);
            }
        }
    }
    json_free(JSON_Handle);

    server_print("[ModelsApi] Loaded %i Models", iJsonModelSize); 
}

public plugin_natives() {
    register_native("models_get_uid", "@Native_GetModelUid");
    register_native("models_get_data", "@Native_GetData");
    register_native("models_give", "@Native_GiveModel");
}

@Native_GetModelUid() {
    enum {
        arg_modelname = 1
    };

    new szGetModelUid[128];
    get_string(arg_modelname, szGetModelUid, PLATFORM_MAX_PATH - 1);

    new iModelId;

    if(!TrieGetCell(g_tModelId, szGetModelUid, iModelId)) {
        return -1;
    }

    return iModelId;
}

@Native_GetData() {
    enum {
        arg_ikey = 1,
        arg_array
    };

    new iKey = get_param(arg_ikey);

    new ModelData[eModelData];
    ArrayGetArray(g_aModelData, iKey, ModelData);
        
    return set_array(arg_array, ModelData, eModelData);
}

@Native_GiveModel() {
    enum {
        arg_userid = 1,
        arg_modelname
    };

    new UserId = get_param(arg_userid);

    if(!is_user_connected(UserId)) {
        return false;
    }

    new szModelName[128];
    get_string(arg_modelname, szModelName, PLATFORM_MAX_PATH - 1);

    new iModelId;

    if(!TrieGetCell(g_tModelId, szModelName, iModelId)) {
        return false;
    }

    return @GiveUserModel(UserId, iModelId);
}

@GiveUserModel(UserId, iModelId) {
    // Тут будет происходить выдача (пока не знаю, как лучше сделать, решил обратиться к вам).
}
C++:
#if defined _modelapi_included
    #endinput
#endif
#define _modelapi_included

enum _:eModelData {
    CMD[128],
    MODEL_V[128],
    MODEL_W[128],
    MODEL_P[128]
};

/**
 * Возвращает айди модели по её назваанию.
 * param - szModelName[]
 *
 * return ModelID
*/
native models_get_uid(szModelName[]);

/**
 * Возвращает нужную информацию по модели исходя из ключа (номер модели).
 * param - iKey
 * param - eModelData
 *
 * return ModelData
*/
native models_get_data(iKey, eModelData);

/**
 * Выдать модельку оружия игроку.
 * param UserId
 * param szModelName[]
 *
 * return GiveUserModel
*/
native models_give(UserId, szModelName[]);

Брал немного код из AUW от steelzzz'a (пример создания "уникального айди" через trie).
 
Сообщения
711
Реакции
476
Помог
10 раз(а)
var_impulse у игрока уже используется
фонарики, граффити и прочая муть

то что ты написал по сути является утилитой для подгрузки
другие плагины, которые с ним будут работать, - обработчики

не понимаю почему ты вообще этот вопрос задаешь, все очевидно
 

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

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