|
Senior Member
Join Date: Jul 2009
Location: Quimper
|

05-10-2012
, 10:54
problem ArrayGetString() in api menu
|
#1
|
Hi all,
I trying to made my api menu model with help of the zplague plugin.
I made this but i have a problem in the menu at this line ArrayGetString(gmodel_name, class, buffer, charsmax(buffer))
this is my error log:
L 05/09/2012 - 06:09  3: Invalid array handle provided (0)
L 05/09/2012 - 06:09  3: [AMXX] Displaying debug trace (plugin "model_test.amxx")
L 05/09/2012 - 06:09  3: [AMXX] Run time error 10: native error (native "ArrayGetString"
Can you help me for fix that please ?
Code:
#include <amxmodx>
#include <fun>
#include <cstrike>
#include <engine>
#include <fakemeta>
new Array:gmodel_name, Array:gmodel_new, Array:gmodel_realname, Array:gmodel_modelsstart,
Array:gmodel_modelsend, Array:gmodel_playermodel, Array:gmodel_modelindex, gmodel_i
new Array:gmodel2_realname, Array:gmodel2_name, Array:gmodel2_modelsstart,
Array:gmodel2_modelsend, Array:gmodel2_playermodel, Array:gmodel2_modelindex
new modelchoosing[33]
new const modelfile[] = "model_list.ini"
public plugin_init()
{
register_clcmd("say /test", "menu_model")
}
public plugin_natives()
{
register_native("register_model_class", "native_register_model", 1)
register_native("get_model", "native_get_model", 1)
}
public plugin_precache()
{
gmodel_name = ArrayCreate(32, 1)
gmodel_realname = ArrayCreate(32, 1)
gmodel_new = ArrayCreate(1, 1)
gmodel_modelsstart = ArrayCreate(1, 1)
gmodel_modelsend = ArrayCreate(1, 1)
gmodel_playermodel = ArrayCreate(32, 1)
gmodel_modelindex = ArrayCreate(1, 1)
gmodel2_realname = ArrayCreate(32, 1)
gmodel2_name = ArrayCreate(32, 1)
gmodel2_modelsstart = ArrayCreate(1, 1)
gmodel2_modelsend = ArrayCreate(1, 1)
gmodel2_playermodel = ArrayCreate(32, 1)
gmodel2_modelindex = ArrayCreate(1, 1)
precache_modelfile()
}
public plugin_cfg()
{
save_modelfile()
}
save_modelfile()
{
new cfgdir[64]
get_localinfo("amxx_configsdir", cfgdir, charsmax(cfgdir))
format(cfgdir, charsmax(cfgdir), "%s/%s", cfgdir, modelfile)
new i, k, buffer[512]
new file = fopen(cfgdir, "at")
new size = ArraySize(gmodel_name)
for (i = 0; i < size; i++)
{
if (ArrayGetCell(gmodel_new, i))
{
ArrayGetString(gmodel_name, i, buffer, charsmax(buffer))
format(buffer, charsmax(buffer), "^n[%s]", buffer)
fputs(file, buffer)
ArrayGetString(gmodel_name, i, buffer, charsmax(buffer))
format(buffer, charsmax(buffer), "^nNAME = %s", buffer)
fputs(file, buffer)
for (k = ArrayGetCell(gmodel_modelsstart, i); k < ArrayGetCell(gmodel_modelsend, i); k++)
{
ArrayGetString(gmodel_playermodel, k, cfgdir, charsmax(cfgdir))
}
format(buffer, charsmax(buffer), "^nMODELS = %s", cfgdir)
fputs(file, buffer)
}
}
fclose(file)
server_print("save custom complete !")
ArrayDestroy(gmodel_realname)
ArrayDestroy(gmodel_name)
ArrayDestroy(gmodel_modelsstart)
ArrayDestroy(gmodel_modelsend)
ArrayDestroy(gmodel_playermodel)
ArrayDestroy(gmodel_modelindex)
}
precache_modelfile()
{
new cfgdir[64]
get_localinfo("amxx_configsdir", cfgdir, charsmax(cfgdir))
format(cfgdir, charsmax(cfgdir), "%s/%s", cfgdir, modelfile)
if (file_exists(cfgdir))
{
new linedata[1024], key[64], value[960]
new file = fopen(cfgdir, "rt")
while (file && !feof(file))
{
fgets(file, linedata, charsmax(linedata))
replace(linedata, charsmax(linedata), "^n", "")
if (!linedata[0] || linedata[0] == ';')
continue;
if (linedata[0] == '[')
{
linedata[strlen(linedata) - 1] = 0
copy(linedata, charsmax(linedata), linedata[1])
ArrayPushString(gmodel2_realname, linedata)
continue;
}
strtok(linedata, key, charsmax(key), value, charsmax(value), '=')
trim(key)
trim(value)
if (equal(key, "NAME"))
ArrayPushString(gmodel2_name, value)
else if (equal(key, "MODELS"))
{
ArrayPushCell(gmodel2_modelsstart, ArraySize(gmodel2_playermodel))
while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ','))
{
trim(key)
trim(value)
ArrayPushString(gmodel2_playermodel, key)
ArrayPushCell(gmodel2_modelindex, -1)
}
ArrayPushCell(gmodel2_modelsend, ArraySize(gmodel2_playermodel))
}
}
if (file)
fclose(file);
}
}
public menu_model(id)
{
static menucar, menu[128], class, buffer[512]
menucar = menu_create("Model Menu", "submenu_carsbuy")
for (class = 0; class < gmodel_i; class++)
{
ArrayGetString(gmodel_name, class, buffer, charsmax(buffer))
if(class > 0)
{
formatex(menu, charsmax(menu), "%s", buffer)
buffer[0] = class
buffer[1] = 0
menu_additem(menucar, menu, buffer)
}
}
menu_setprop(menucar, MPROP_BACKNAME, "Back")
menu_setprop(menucar, MPROP_NEXTNAME, "Next")
menu_setprop(menucar, MPROP_EXITNAME, "Quit")
menu_display(id, menucar)
}
public submenu_carsbuy(id, menucar, item)
{
if (item == MENU_EXIT)
return PLUGIN_HANDLED;
static buffer[2], dummy, classid
menu_item_getinfo(menucar, item, dummy, buffer, charsmax(buffer), _, _, dummy)
classid = buffer[0]
modelchoosing[id] = classid
static name[32]
ArrayGetString(gmodel_name, modelchoosing[id], name, charsmax(name))
client_print(id, print_chat, " %s", name)
menu_destroy(menucar)
return PLUGIN_HANDLED;
}
public native_register_model(const name[], model[])
{
param_convert(1)
param_convert(2)
ArrayPushString(gmodel_name, name)
ArrayPushCell(gmodel_modelsstart, ArraySize(gmodel_playermodel))
ArrayPushString(gmodel_playermodel, model)
ArrayPushCell(gmodel_modelsend, ArraySize(gmodel_playermodel))
ArrayPushCell(gmodel_modelindex, -1)
ArrayPushCell(gmodel_new, 1)
new i, k, buffer[32], nummodels_custom, nummodels_default, prec_mdl[100], size = ArraySize(gmodel2_realname)
for (i = 0; i < size; i++)
{
ArrayGetString(gmodel2_realname, i, buffer, charsmax(buffer))
if (!equal(name, buffer))
continue;
ArraySetCell(gmodel_new, gmodel_i, 0)
ArrayGetString(gmodel2_name, i, buffer, charsmax(buffer))
ArraySetString(gmodel_name, gmodel_i, buffer)
nummodels_custom = ArrayGetCell(gmodel2_modelsend, i) - ArrayGetCell(gmodel2_modelsstart, i)
nummodels_default = ArrayGetCell(gmodel_modelsend, gmodel_i) - ArrayGetCell(gmodel_modelsstart, gmodel_i)
for (k = 0; k < min(nummodels_custom, nummodels_default); k++)
{
ArrayGetString(gmodel2_playermodel, ArrayGetCell(gmodel2_modelsstart, i) + k, buffer, charsmax(buffer))
ArraySetString(gmodel_playermodel, ArrayGetCell(gmodel_modelsstart, gmodel_i) + k, buffer)
formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
ArraySetCell(gmodel_modelindex, ArrayGetCell(gmodel_modelsstart, gmodel_i) + k, engfunc(EngFunc_PrecacheModel, prec_mdl))
}
}
if (ArrayGetCell(gmodel_new, gmodel_i))
{
formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", model, model)
ArraySetCell(gmodel_modelindex, ArrayGetCell(gmodel_modelsstart, gmodel_i), engfunc(EngFunc_PrecacheModel, prec_mdl))
}
gmodel_i++
return gmodel_i-1;
}
public native_get_model(id)
{
return modelchoosing[id];
}
I made this little plugin for my test but the menu hasn't open.
Code:
#include <amxmodx>
#include <model_test>
new const myfirstmodel_name[] = "Daffy"
new const myfirstmodel_model[] = "daffyduck"
new const mymodel2_name[] = "Bugs Bunny"
new const mymodel2_model[] = "rabbits"
new firstmodel, model2
public plugin_init()
{
firstmodel = register_model_class(myfirstmodel_name, myfirstmodel_model)
model2 = register_model_class(mymodel2_name, mymodel2_model)
register_clcmd("say model", "modelchoose")
}
public modelchoose(id)
{
if(get_model(id) == firstmodel)
client_print(id, print_chat, "you have choose first model")
else if(get_model(id) == model2)
client_print(id, print_chat, "you have choose second model")
}
Last edited by spirit; 05-10-2012 at 10:55.
|
|