04/12/2018, 06:43 PM
(Última modificación: 04/12/2018, 06:44 PM por metita. Edited 2 times in total.)
Es lo que dice el titulo, estare publicando un par de plugins que tengo por ahi dando vueltas, como este que es de Sugisaki y creo para mi.
Requisitos:
- AMXX 1.8.3 (Fue hecho para esa version, no fue compilado ni con 1.8.2 ni con 1.9.0 ni posteriores builds).
- ReAPI
- adv_vault
El codigo sufrio ediciones minimas hace meses atras y cumple el proposito completamente, ademas, tiene integrado un mini-sistema de puntos junto con un set de natives que les podria servir.
Ademas deben crear un archivo .ini en amxmodx/configs llamado hats.ini.
dentro, deben tener esta estructura para todo:
No lo he compilado desde entonces, por si alguien puede corroborar que compile y esta funcionando, la ultima vez que lo probe andaba perfecto.
Requisitos:
- AMXX 1.8.3 (Fue hecho para esa version, no fue compilado ni con 1.8.2 ni con 1.9.0 ni posteriores builds).
- ReAPI
- adv_vault
El codigo sufrio ediciones minimas hace meses atras y cumple el proposito completamente, ademas, tiene integrado un mini-sistema de puntos junto con un set de natives que les podria servir.
Ademas deben crear un archivo .ini en amxmodx/configs llamado hats.ini.
dentro, deben tener esta estructura para todo:
Código PHP:
[HATS]
; "NOMBRE DEL HAT" "UBICACION DEL HAT" "COSTO"
"test1 hat" "models/model_hat/test1.mdl" "10"
[MODELS]
; "NOMBRE A MOSTRAR DEL MODEL" "NOMBRE DE LA CARPETA DONDE SE ENCUENTRA" "COSTO"
"test1 model" "player/modelo" "40"
Código PHP:
#include <amxmodx>
#include <reapi>
#include <engine>
#include <fakemeta>
#include <adv_vault>
#define MAX_ITEMS 32
// Nombre del archivo de configuracion
new const FILE_HATS[] = "hats.ini"
enum _:E_FIELDS
{
HAT = 0,
MODEL,
COINS
}
new g_fields[E_FIELDS];
new g_vault;
new ent_hat[33]
new pCoins[33]
new bool:g_pHats[33][MAX_ITEMS]
new bool:g_pModels[33][MAX_ITEMS]
new Array:g_hats
new Array:g_hats_name
new Array:g_hats_costo
new Array:g_models
new Array:g_models_name
new Array:g_models_costo
new bool:DataLoaded[33]
new callback_models
new callback_hats
new callback_hats_select
new callback_model_select
new gPCurrentHat[33]
new gPCurrentModel[33]
new g_PlayerName[33][33]
new bool:g_bNeedLoad[33]
public plugin_init()
{
RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true)
register_vault();
register_clcmd("say /hats", "OnCallHats")
register_clcmd("say /puntos", "fnc_puntos")
register_clcmd("say /models", "OnCallModels_Menu")
callback_hats = menu_makecallback("mc_hats_buy")
callback_models = menu_makecallback("mc_models_buy")
callback_hats_select = menu_makecallback("mc_hats_select")
callback_model_select = menu_makecallback("mc_model_select")
}
public CBasePlayer_Spawn(id)
{
if(g_bNeedLoad[id])
{
Update_CargarDatos(id)
g_bNeedLoad[id] = false
}
}
public client_putinserver(id)
{
arrayset(g_pHats[id], false, sizeof(g_pHats[]))
arrayset(g_pModels[id], false, sizeof(g_pModels[]))
gPCurrentHat[id] = -1
gPCurrentModel[id] = -1
pCoins[id] = 0;
get_user_name(id, g_PlayerName[id], charsmax(g_PlayerName[]))
g_bNeedLoad[id] = true
}
register_vault()
{
g_vault = adv_vault_open("hats")
g_fields[HAT] = adv_vault_register_field(g_vault, "hats", DATATYPE_STRING, 128)
g_fields[MODEL] = adv_vault_register_field(g_vault, "models", DATATYPE_STRING, 128)
g_fields[COINS] = adv_vault_register_field(g_vault, "coins", DATATYPE_INT)
adv_vault_init(g_vault)
}
set_entity_hat(id, hat_id)
{
if(ent_hat[id] <= 0)
{
new ent = create_entity("info_target")
ent_hat[id] = ent
entity_set_string(ent, EV_SZ_classname, "player_hat")
entity_set_int(ent, EV_INT_movetype, MOVETYPE_FOLLOW)
entity_set_edict(ent, EV_ENT_aiment, id)
entity_set_edict(ent, EV_ENT_owner, id)
}
if(0 <= hat_id < ArraySize( g_hats))
{
if(is_valid_ent(ent_hat[id]))
{
new hat_loc[68]
ArrayGetString( g_hats, hat_id, hat_loc, charsmax(hat_loc))
engfunc(EngFunc_SetModel, ent_hat[id], hat_loc)
}
}
else if(hat_id < 0)
{
if(is_valid_ent(ent_hat[id]))
{
remove_entity(ent_hat[id])
}
ent_hat[id] = 0
}
gPCurrentHat[id] = hat_id
}
public plugin_precache()
{
new szConfig[128]
get_localinfo("amxx_configsdir", szConfig, charsmax(szConfig))
formatex(szConfig[ strlen(szConfig) ], charsmax(szConfig), "/%s", FILE_HATS)
if(!file_exists(szConfig))
{
set_fail_state("[AMXX] Archivo de configuracion: ^"%s^" no existe", szConfig)
return
}
new fh = fopen( szConfig, "r")
if(!fh)
{
set_fail_state("[AMXX] No se pudo abrir el archivo de configuracion")
return
}
new line[256], parse1[128], parse2[128],precache_mode,parse3[10]
g_hats = ArrayCreate(68,MAX_ITEMS)
g_hats_name = ArrayCreate(68,MAX_ITEMS)
g_hats_costo = ArrayCreate(1, MAX_ITEMS)
g_models_costo = ArrayCreate(1, MAX_ITEMS)
g_models = ArrayCreate(68,MAX_ITEMS)
g_models_name = ArrayCreate(68,MAX_ITEMS)
while(!feof(fh))
{
fgets(fh, line, charsmax(line))
trim(line)
if(!line[0] || line[0] == ';')
{
continue;
}
if(line[0] == '[')
{
if(equali(line,"[HATS]"))
{
precache_mode = 1;
continue;
}
else if(equali(line,"[MODELS]"))
{
precache_mode = 2;
continue
}
else
{
precache_mode = 0;
}
}
if(!(1<=precache_mode<=2))
{
continue;
}
parse(line, parse1, charsmax(parse1), parse2, charsmax(parse2), parse3, charsmax(parse3))
trim(parse1)
trim(parse2)
trim(parse3)
if(! parse3[0])
{
copy(parse3, charsmax(parse3), "0")
}
if(!is_str_num(parse3))
{
log_amx("[AMXX] Solo se permiten numeros en el costo del objeto. [Objeto: %s]", parse1)
continue;
}
switch(precache_mode)
{
case 1 :
{
if( ArraySize( g_hats_name) >= MAX_ITEMS)
{
log_amx("[AMXX] Se alcanzo el numero maximo de items en los Sombreros.")
precache_mode = 2;
continue;
}
if(! file_exists(parse2))
{
log_amx("[AMXX] El modelo ^"%s^" no existe, verifica la ruta del mismo.", parse2)
continue;
}
ArrayPushString( g_hats, parse2)
ArrayPushString( g_hats_name, parse1)
ArrayPushCell( g_hats_costo , str_to_num(parse3))
precache_model(parse2);
}
case 2 :
{
if( ArraySize( g_models_name) >= MAX_ITEMS)
{
log_amx("[AMXX] Se alcanzo el numero maximo de items en los Modelos de jugadores.")
break;
}
if(!file_exists(fmt("models/player/%s/%s.mdl", parse2, parse2)))
{
log_amx("[AMXX] El modelo ^"%s^" no existe, verifica la ruta del mismo.", parse2)
continue;
}
ArrayPushString( g_models_name, parse1)
formatex(parse1, charsmax(parse1), "models/player/%s/%s.mdl", parse2, parse2)
precache_model(parse1)
formatex(parse1, charsmax(parse1), "models/player/%s/%sT.mdl", parse2, parse2)
if( file_exists(parse1))
{
precache_model(parse1)
}
ArrayPushString( g_models, parse2)
ArrayPushCell( g_models_costo , str_to_num(parse3))
}
}
}
fclose(fh)
}
stock add_coins(id, amount)
{
if(!(1<=id <= get_maxplayers()))
{
return false;
}
pCoins[id] += amount
Update_Save(id)
return true
}
stock bool:rest_coins(id, amount)
{
if(! (1<= id <= get_maxplayers()) || pCoins[id] < amount)
{
return false
}
pCoins[id] -= amount
return true
}
public plugin_natives()
{
register_native("add_coins", "_native_add_coins")
register_native("rest_coins", "_native_rest_coins")
register_native("get_coins", "_native_get_coins")
}
public _native_add_coins()
{
add_coins( get_param(1), get_param(2))
}
public _native_rest_coins()
{
return rest_coins( get_param(1), get_param(2))
}
public _native_get_coins()
{
if(1<= get_param(1) <= get_maxplayers())
{
return pCoins[get_param(1)]
}
return 0;
}
stock explode(const string[], const delimiter[] = " ", output[][], array_len ,out_lent)
{
new szChar[128]
copy(szChar, charsmax(szChar), string)
for(new i = 0 ; i <= array_len ; i++)
{
split(szChar, output[i], out_lent, szChar, charsmax(szChar), delimiter)
}
}
public Update_CargarDatos(id)
{
DataLoaded[id] = true
if(!adv_vault_get_prepare( g_vault, 0, g_PlayerName[id]))
{
return;
}
new szChar[128]
adv_vault_get_field( g_vault, g_fields[ HAT], szChar, charsmax(szChar));
SplitSpring(id, szChar, g_pHats)
adv_vault_get_field( g_vault, g_fields[ MODEL], szChar, charsmax(szChar))
SplitSpring(id, szChar, g_pModels)
pCoins[id] = adv_vault_get_field( g_vault, g_fields[ COINS])
}
SplitSpring(id, szChar[], bool:outarray[33][])
{
new szChar2[ MAX_ITEMS][3]
explode(szChar, ",", szChar2, charsmax(szChar2), charsmax(szChar2[]));
new i = 0;
for( i = 0 ; i < MAX_ITEMS ; i++)
{
trim(szChar2[i])
if(!szChar2[i][0])
{
continue
}
outarray[id][ str_to_num(szChar2[i])] = true
}
}
stock implode(id, bool:array[][], ret[], ret_len)
{
new len = 0;
for(new i = 0 ; i < MAX_ITEMS ; i++)
{
if(array[id][i])
{
if(len > 0)
{
len += formatex(ret[len], ret_len, ",%i", i)
}
else
{
len = formatex(ret, ret_len, "%i", i)
}
}
}
return 1;
}
public Update_Save(id)
{
static str1[128], str2[128]
implode(id, g_pHats, str1, charsmax(str1))
implode(id, g_pModels, str2, charsmax(str2))
adv_vault_set_start( g_vault)
adv_vault_set_field( g_vault, g_fields[ COINS], pCoins[id])
adv_vault_set_field( g_vault, g_fields[ HAT], str1)
adv_vault_set_field( g_vault, g_fields[ MODEL], str2)
adv_vault_set_end( g_vault, 0, g_PlayerName[id])
str1[0] = EOS
str2[0] = EOS
}
public client_disconnected(id)
{
DataLoaded[id] = false
set_entity_hat(id, -1)
}
public client_connect(id)
{
DataLoaded[id] = false
}
public OnCallHats(id)
{
if(!DataLoaded[id])
{
return
}
new menu = menu_create("Menu general de sombreros", "mh_hatsmenu")
menu_additem(menu, "Acceder a la tienda de sombreros")
menu_additem(menu, "Ver mis sombreros comprados")
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, .time=60)
}
public mh_hatsmenu(id, menu, item)
{
if(item == MENU_EXIT || ! DataLoaded[id])
{
menu_destroy(menu)
return
}
menu_destroy(menu)
new i = 0
new num[4]
switch(item)
{
case 0 :
{
menu = menu_create(fmt("\wMenu de compra de sombreros^n\wPosees: \y%i Puntos", pCoins[id]), "mh_buyhat")
for(i = 0 ; i < ArraySize( g_hats_name) ; i++)
{
num_to_str(i, num, charsmax(num))
if( g_pHats[id][i])
{
menu_additem(
menu,
fmt("%a \y[COMPRADO]", ArrayGetStringHandle( g_hats_name, i)),
num,
0,
callback_hats
);
}
else if( ArrayGetCell( g_hats_costo, i) > pCoins[id])
{
menu_additem(
menu,
fmt("%a [%i Puntos]", ArrayGetStringHandle( g_hats_name, i), ArrayGetCell( g_hats_costo, i)),
num,
0,
callback_hats
);
}
else
{
menu_additem(
menu,
fmt("%a \w[\y%i Puntos\w]", ArrayGetStringHandle( g_hats_name, i), ArrayGetCell( g_hats_costo, i)),
num,
0,
callback_hats
);
}
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, .time=60)
}
case 1 :
{
menu = menu_create("Mis sombreros", "mh_select_hat")
menu_additem(menu, "Quitar mi sombrero actual", "-1", 0, callback_hats_select)
for( i = 0 ; i < ArraySize( g_hats_name) ; i++)
{
num_to_str(i, num, charsmax(num))
if( gPCurrentHat[id] == i)
{
menu_additem(menu, fmt("%a \y[ACTUAL]", ArrayGetStringHandle( g_hats_name, i)), num, 0, callback_hats_select);
}
else if( g_pHats[id][i])
{
menu_additem(menu, fmt("%a", ArrayGetStringHandle( g_hats_name, i)), num, 0, callback_hats_select);
}
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, .time=60)
}
}
}
public mc_hats_buy(id, menu, item)
{
new info[4], a
menu_item_getinfo(menu, item, a, info, 3, "", 0, a);
a = str_to_num(info)
if( ArrayGetCell( g_hats_costo, a) > pCoins[id] || g_pHats[id][a])
{
return ITEM_DISABLED
}
return ITEM_ENABLED
}
public mh_select_hat(id, menu, item)
{
if(item == MENU_EXIT || ! DataLoaded[id])
{
menu_destroy(menu)
return
}
if(item == 0)
{
set_entity_hat(id, -1)
menu_destroy(menu)
return
}
new info[4], a
menu_item_getinfo(menu, item, a, info, 3, "", 0, a);
menu_destroy(menu)
a = str_to_num(info);
set_entity_hat(id, a);
client_print_color(id, print_team_default, "^4[AMXX]^1 Ahora estas usando el sombrero:^4 %a", ArrayGetStringHandle( g_hats_name, a))
}
public fnc_puntos(id)
{
client_print_color(id, print_team_default, "^4[AMXX]^1 Tienes^4 %i Puntos^1 en tu cuenta", pCoins[id])
}
public OnCallModels_Menu(id)
{
if(! DataLoaded[id])
{
return
}
new menu = menu_create("Menu general de Modelos", "mh_models")
menu_additem(menu, "Acceder a la tienda de Modelos")
menu_additem(menu, "Ver mis modelos comprados")
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, .time=60)
}
public mh_models(id, menu, item)
{
menu_destroy(menu)
if(item == MENU_EXIT || ! DataLoaded[id])
{
return
}
switch(item)
{
case 0 :
{
show_shop_models(id)
}
case 1 :
{
show_own_models(id)
}
}
}
show_shop_models(id)
{
if( ArraySize( g_models ) > 0)
{
new menu = menu_create( fmt("\wMenu de compra de modelos^n\wPosees: \y%i Puntos", pCoins[id]), "mh_models_buy")
new num[4]
for(new i = 0 ; i < ArraySize( g_models) ; i+=1)
{
num_to_str(i, num, charsmax(num))
if( g_pModels[id][i] )
{
menu_additem(
menu,
fmt("%a \y[COMPRADO]", ArrayGetStringHandle( g_models_name, i)),
num,
0,
callback_models
);
}
else if( ArrayGetCell( g_models_costo, i) > pCoins[id])
{
menu_additem(
menu,
fmt("%a [%i Puntos]", ArrayGetStringHandle( g_models_name, i), ArrayGetCell( g_models_costo, i) ),
num,
0,
callback_models
);
}
else
{
menu_additem(
menu,
fmt("\w%a \w[\y%i Puntos\w]", ArrayGetStringHandle( g_models_name, i), ArrayGetCell( g_models_costo, i)),
num,
0,
callback_models
);
}
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, .time=60)
}
else
{
client_print_color(id, print_team_default, "^4[AMXX]^1 No hay modelos de jugadores disponibles en la tienda.")
}
}
public mc_models_buy(id, menu, item)
{
new info[4], a
menu_item_getinfo(menu, item, a, info, charsmax(info), "", 0, a)
a = str_to_num(info)
if( ArrayGetCell( g_models_costo, a) > pCoins[id] || g_pModels[id][a])
{
return ITEM_DISABLED
}
return ITEM_ENABLED
}
public mh_buyhat(id, menu, item)
{
if(item == MENU_EXIT || ! DataLoaded[id])
{
menu_destroy(menu)
return
}
new info[4], a
menu_item_getinfo(menu, item, a, info, 3, "", 0, a);
menu_destroy(menu)
a = str_to_num(info)
if( g_pHats[id][a])
{
client_print_color(id, print_team_default, "^4[AMXX]^1 Ya posees este sombrero.")
return
}
else if( ( g_pHats[id][a] = rest_coins(id, ArrayGetCell( g_hats_costo, a))) == false)
{
client_print_color(id, print_team_default, "^4[AMXX]^1 No tienes suficientes^4 Puntos^1 para comprar este sombrero.")
return;
}
Update_Save(id);
client_print_color(id, print_team_default, "^4[AMXX]^1 Compraste el sombrero:^4 %a", ArrayGetStringHandle( g_hats_name, a))
}
public mh_models_buy(id, menu, item)
{
if(item == MENU_EXIT || ! DataLoaded[id])
{
menu_destroy(menu)
return
}
new info[4], a
menu_item_getinfo(menu, item, a, info, charsmax(info), "", 0, a)
a = str_to_num(info)
menu_destroy(menu)
if(g_pModels[id][a])
{
client_print_color(id, print_team_default, "^4[AMXX]^1 Ya posees este modelo, revisa tu inventario para ver tus modelos disponibles.")
return
}
else if( ( g_pModels[id][a] = rest_coins(id, ArrayGetCell( g_models_costo, a))) == false)
{
client_print_color(id, print_team_default, "^4[AMXX]^1 No tienes suficientes^4 Puntos^1 para comprar este modelo.")
return;
}
Update_Save(id)
client_print_color(id, print_team_default, "^4[AMXX]^1 Compraste el modelo:^4 %a", ArrayGetStringHandle( g_models_name, a))
}
public mh_select_model(id, menu, item)
{
if(item == MENU_EXIT || ! DataLoaded[id])
{
menu_destroy(menu)
return
}
if(item == 0)
{
set_model(id, -1)
menu_destroy(menu)
return
}
new info[4], a
menu_item_getinfo(menu, item, a, info, 3, "", 0, a);
menu_destroy(menu)
a = str_to_num(info);
set_model(id, a);
client_print_color(id, print_team_default, "^4[AMXX]^1 Ahora estas usando el modelo:^4 %a", ArrayGetStringHandle( g_models_name, a))
}
stock set_model(id, const model_id)
{
if(model_id < 0)
{
rg_reset_user_model(id, true)
}
else
{
rg_set_user_model(id, fmt("%a", ArrayGetStringHandle( g_models, model_id)) , true)
}
gPCurrentModel[id] = model_id
}
public show_own_models(id)
{
new menu = menu_create("Lista de modelos comprados", "mh_select_model")
new num[4]
menu_additem(menu, "Quitar mi modelo actual", "-1", 0, callback_model_select)
for( new i = 0 ; i < ArraySize( g_models) ; i++)
{
num_to_str(i, num, charsmax(num))
if( gPCurrentModel[id] == i)
{
menu_additem(menu, fmt("%a \y[ACTUAL]", ArrayGetStringHandle( g_models_name, i)), num, 0, callback_model_select);
}
else if( g_pModels[id][i])
{
menu_additem(menu, fmt("%a", ArrayGetStringHandle( g_models_name, i)), num, 0, callback_model_select);
}
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, .time=60)
}
public mc_hats_select(id, menu, item)
{
new info[4], a
menu_item_getinfo(menu, item, a, info, charsmax(info), "", 0, a)
a = str_to_num(info)
if( gPCurrentHat[id] == a)
{
return ITEM_DISABLED
}
return ITEM_ENABLED
}
public mc_model_select(id, menu, item)
{
new info[4], a
menu_item_getinfo(menu, item, a, info, charsmax(info), "", 0, a)
a = str_to_num(info)
if( gPCurrentModel[id] == a)
{
return ITEM_DISABLED
}
return ITEM_ENABLED
}
No lo he compilado desde entonces, por si alguien puede corroborar que compile y esta funcionando, la ultima vez que lo probe andaba perfecto.