Участник
Пользователь
- Сообщения
- 899
- Реакции
- 150
- Помог
- 25 раз(а)
Здравствуйте.
Решил для себя сделать меню выдачи моделей так, что бы не конфликтовало с другими плагинами (аля вип меню и так далее).
Так вот, вопрос. Будет ли целесообразно сделать следующим образом?
Выдавать так называемый "ключ" (аля уникальное название) через trie, и потом выдавать игроку var_impulse? Или же, можно как-то по другому сделать?
Что то на подобии такого:
Брал немного код из AUW от steelzzz'a (пример создания "уникального айди" через trie).
Решил для себя сделать меню выдачи моделей так, что бы не конфликтовало с другими плагинами (аля вип меню и так далее).
Так вот, вопрос. Будет ли целесообразно сделать следующим образом?
Выдавать так называемый "ключ" (аля уникальное название) через 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).