Comprar sombreros/modelos con guardado
#1
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:

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], falsesizeof(g_pHats[]))
    
arrayset(g_pModels[id], falsesizeof(g_pModels[]))
    
    
gPCurrentHat[id] = -1
    gPCurrentModel
[id] = -1
    pCoins
[id] = 0;
    
    
get_user_name(idg_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_STRING128)
    
g_fields[MODEL]    = adv_vault_register_field(g_vault"models"DATATYPE_STRING128)
    
g_fields[COINS]    = adv_vault_register_field(g_vault"coins"DATATYPE_INT)
    
adv_vault_init(g_vault)
}

set_entity_hat(idhat_id)
{
    if(
ent_hat[id] <= 0)
    {
        new 
ent create_entity("info_target")
        
ent_hat[id] = ent
        entity_set_string
(entEV_SZ_classname"player_hat")
        
entity_set_int(entEV_INT_movetypeMOVETYPE_FOLLOW)
        
entity_set_edict(entEV_ENT_aimentid)
        
entity_set_edict(entEV_ENT_ownerid)
    }
    if(
<= hat_id ArraySizeg_hats))
    {
        if(
is_valid_ent(ent_hat[id]))
        {
            new 
hat_loc[68]
            
ArrayGetStringg_hatshat_idhat_loccharsmax(hat_loc))
            
engfunc(EngFunc_SetModelent_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"szConfigcharsmax(szConfig))
    
formatex(szConfigstrlen(szConfig) ], charsmax(szConfig), "/%s"FILE_HATS)
    
    if(!
file_exists(szConfig))
    {
        
set_fail_state("[AMXX] Archivo de configuracion: ^"%s^" no existe"szConfig)
        return
    }
    
    new 
fh fopenszConfig"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(1MAX_ITEMS)
    
g_models_costo ArrayCreate(1MAX_ITEMS)
    
g_models ArrayCreate(68,MAX_ITEMS)
    
g_models_name ArrayCreate(68,MAX_ITEMS)
    while(!
feof(fh))
    {
        
fgets(fhlinecharsmax(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(lineparse1charsmax(parse1), parse2charsmax(parse2), parse3charsmax(parse3))
        
trim(parse1)
        
trim(parse2)
        
trim(parse3)
        if(! 
parse3[0])
        {
            
copy(parse3charsmax(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 
:
            {
                if( 
ArraySizeg_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;
                }
                
                
ArrayPushStringg_hatsparse2)
                
ArrayPushStringg_hats_nameparse1)
                
ArrayPushCellg_hats_costo str_to_num(parse3))
                
precache_model(parse2);
            }
            case 
:
            {
                if( 
ArraySizeg_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"parse2parse2)))
                {
                    
log_amx("[AMXX] El modelo ^"%s^" no existe, verifica la ruta del mismo."parse2)
                    continue;
                }
                
                
ArrayPushStringg_models_nameparse1)
                
formatex(parse1charsmax(parse1), "models/player/%s/%s.mdl"parse2parse2)
                
precache_model(parse1)
                
formatex(parse1charsmax(parse1), "models/player/%s/%sT.mdl"parse2parse2)
                
                if( 
file_exists(parse1))
                {
                    
precache_model(parse1)
                }
                
                
ArrayPushStringg_modelsparse2)
                
ArrayPushCellg_models_costo str_to_num(parse3))
            }
        }
    }
    
    
fclose(fh)
}

stock add_coins(idamount)
{
    if(!(
1<=id  <= get_maxplayers()))
    {
        return 
false;
    }
    
pCoins[id] += amount
    Update_Save
(id)
    return 
true
}

stock bool:rest_coins(idamount)
{
    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_coinsget_param(1), get_param(2))
}
public 
_native_rest_coins()
{
    return 
rest_coinsget_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(szCharcharsmax(szChar), string)
    for(new 
<= array_len i++)
    {
        
split(szCharoutput[i], out_lentszCharcharsmax(szChar), delimiter)
    }
}
public 
Update_CargarDatos(id)
{
    
DataLoaded[id] = true
    
if(!adv_vault_get_prepareg_vault0g_PlayerName[id]))
    {
        return;
    }
    
    new 
szChar[128]
    
adv_vault_get_fieldg_vaultg_fieldsHAT], szCharcharsmax(szChar));
    
SplitSpring(idszCharg_pHats)
    
adv_vault_get_fieldg_vaultg_fieldsMODEL], szCharcharsmax(szChar))
    
SplitSpring(idszCharg_pModels)
    
pCoins[id] = adv_vault_get_fieldg_vaultg_fieldsCOINS])
}

SplitSpring(idszChar[], bool:outarray[33][])
{
    new 
szChar2MAX_ITEMS][3]
    
explode(szChar","szChar2charsmax(szChar2), charsmax(szChar2[]));
    new 
0
    for( 
MAX_ITEMS i++)
    {
        
trim(szChar2[i])
        if(!
szChar2[i][0])
        {
            continue
        }
        
outarray[id][ str_to_num(szChar2[i])] = true
    
}
}

stock implode(idbool:array[][], ret[], ret_len)
{
    new 
len 0;
    for(new 
MAX_ITEMS i++)
    {
        if(array[
id][i])
        {
            if(
len 0)
            {
                
len += formatex(ret[len], ret_len",%i"i)
            }
            else
            {
                
len formatex(retret_len"%i"i)
            }
        }
    }
    return 
1;
}

public 
Update_Save(id)
{
    static 
str1[128], str2[128]
    
implode(idg_pHatsstr1charsmax(str1))
    
implode(idg_pModelsstr2charsmax(str2))
    
adv_vault_set_startg_vault)
    
adv_vault_set_fieldg_vaultg_fieldsCOINS], pCoins[id])
    
adv_vault_set_fieldg_vaultg_fieldsHAT], str1)
    
adv_vault_set_fieldg_vaultg_fieldsMODEL], str2)
    
adv_vault_set_endg_vault0g_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(menuMPROP_EXITMEXIT_ALL)
    
menu_display(idmenu, .time=60)
}
public 
mh_hatsmenu(idmenuitem)
{
    if(
item == MENU_EXIT || ! DataLoaded[id])
    {
        
menu_destroy(menu)
        return
    }
    
menu_destroy(menu)
    new 
0
    
new num[4]
    switch(
item)
    {
        case 

        {
            
menu menu_create(fmt("\wMenu de compra de sombreros^n\wPosees: \y%i Puntos"pCoins[id]), "mh_buyhat")
            for(
ArraySizeg_hats_name) ; i++)
            {
                
num_to_str(inumcharsmax(num))
                if( 
g_pHats[id][i])
                {
                    
menu_additem(
                        
menu
                        
fmt("%a \y[COMPRADO]"ArrayGetStringHandleg_hats_namei)),
                        
num
                        
0
                        
callback_hats
                        
);
                }
                else if( 
ArrayGetCellg_hats_costoi) > pCoins[id])
                {
                    
menu_additem(
                        
menu
                        
fmt("%a [%i Puntos]"ArrayGetStringHandleg_hats_namei), ArrayGetCellg_hats_costoi)),
                        
num
                        
0
                        
callback_hats
                        
);
                }
                else
                {
                    
menu_additem(
                        
menu
                        
fmt("%a \w[\y%i Puntos\w]"ArrayGetStringHandleg_hats_namei), ArrayGetCellg_hats_costoi)),
                        
num
                        
0
                        
callback_hats
                        
);
                }
            }
            
menu_setprop(menuMPROP_EXITMEXIT_ALL)
            
menu_display(idmenu, .time=60)
        }
        case 
:
        {
            
menu menu_create("Mis sombreros""mh_select_hat")
            
menu_additem(menu"Quitar mi sombrero actual""-1"0callback_hats_select)
            for( 
ArraySizeg_hats_name) ; i++)
            {
                
num_to_str(inumcharsmax(num))
                if( 
gPCurrentHat[id] == i)
                {
                    
menu_additem(menufmt("%a \y[ACTUAL]"ArrayGetStringHandleg_hats_namei)), num0callback_hats_select);
                }
                else if( 
g_pHats[id][i])
                {
                    
menu_additem(menufmt("%a"ArrayGetStringHandleg_hats_namei)), num0callback_hats_select);
                }
            }
            
menu_setprop(menuMPROP_EXITMEXIT_ALL)
            
menu_display(idmenu, .time=60)
        }
    }
}
public 
mc_hats_buy(idmenuitem)
{
    new 
info[4], a
    menu_item_getinfo
(menuitemainfo3""0a);
    
str_to_num(info)
    if( 
ArrayGetCellg_hats_costoa) > pCoins[id] || g_pHats[id][a])
    {
        return 
ITEM_DISABLED
    
}
    return 
ITEM_ENABLED
}


public 
mh_select_hat(idmenuitem)
{
    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
(menuitemainfo3""0a);
    
menu_destroy(menu)
    
str_to_num(info);
    
set_entity_hat(ida);
    
client_print_color(idprint_team_default"^4[AMXX]^1 Ahora estas usando el sombrero:^4 %a"ArrayGetStringHandleg_hats_namea))

}
public 
fnc_puntos(id)
{    
    
client_print_color(idprint_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(menuMPROP_EXITMEXIT_ALL)
    
menu_display(idmenu, .time=60)
}
public 
mh_models(idmenuitem)
{
    
menu_destroy(menu)
    if(
item == MENU_EXIT || ! DataLoaded[id])
    {          
        return
    }
    switch(
item)
    {
        case 
:
        {
            
show_shop_models(id)
        }
        case 
:
        {
            
show_own_models(id)
        }
    }
}
show_shop_models(id)
{
    if( 
ArraySizeg_models ) > 0)
    {
        new 
menu menu_createfmt("\wMenu de compra de modelos^n\wPosees: \y%i Puntos"pCoins[id]), "mh_models_buy")
        new 
num[4]
        for(new 
ArraySizeg_models) ; i+=1)
        {
            
num_to_str(inumcharsmax(num))
            if( 
g_pModels[id][i] )
            {
                
menu_additem(
                    
menu
                    
fmt("%a \y[COMPRADO]"ArrayGetStringHandleg_models_namei)),
                    
num
                    
0
                    
callback_models
                
);
            }
            else if( 
ArrayGetCellg_models_costoi) > pCoins[id])
            {
                
menu_additem(
                    
menu,
                    
fmt("%a [%i Puntos]"ArrayGetStringHandleg_models_namei), ArrayGetCellg_models_costoi) ),
                    
num,
                    
0,
                    
callback_models
                
);
            }
            else
            {
                
menu_additem(
                    
menu,
                    
fmt("\w%a \w[\y%i Puntos\w]"ArrayGetStringHandleg_models_namei), ArrayGetCellg_models_costoi)),
                    
num,
                    
0,
                    
callback_models
                
);
            }
        }
        
menu_setprop(menuMPROP_EXITMEXIT_ALL)
        
menu_display(idmenu, .time=60)
    }
    else
    {
        
client_print_color(idprint_team_default"^4[AMXX]^1 No hay modelos de jugadores disponibles en la tienda.")
    }
}
public 
mc_models_buy(idmenuitem)
{
    new 
info[4], a
    menu_item_getinfo
(menuitemainfocharsmax(info), ""0a)
    
str_to_num(info)
    if( 
ArrayGetCellg_models_costoa) > pCoins[id] || g_pModels[id][a])
    {
        return 
ITEM_DISABLED
    
}
    return 
ITEM_ENABLED
}
public 
mh_buyhat(idmenuitem)
{
    if(
item == MENU_EXIT || ! DataLoaded[id])
    {
        
menu_destroy(menu)
        return
    }
    new 
info[4], a
    menu_item_getinfo
(menuitemainfo3""0a);
    
menu_destroy(menu)
    
str_to_num(info)
    if( 
g_pHats[id][a])
    {
        
client_print_color(idprint_team_default"^4[AMXX]^1 Ya posees este sombrero.")
        return    
    }
    else if( ( 
g_pHats[id][a] = rest_coins(idArrayGetCellg_hats_costoa))) == false)
    {
        
client_print_color(idprint_team_default"^4[AMXX]^1 No tienes suficientes^4 Puntos^1 para comprar este sombrero.")
        return;
    }
    
Update_Save(id);
    
client_print_color(idprint_team_default"^4[AMXX]^1 Compraste el sombrero:^4 %a"ArrayGetStringHandleg_hats_namea))
}
public 
mh_models_buy(idmenuitem)
{
    if(
item == MENU_EXIT || ! DataLoaded[id])
    {
        
menu_destroy(menu)
        return
    }
    new 
info[4], a
    menu_item_getinfo
(menuitemainfocharsmax(info), ""0a)
    
str_to_num(info)
    
menu_destroy(menu)
    if(
g_pModels[id][a])
    {
        
client_print_color(idprint_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(idArrayGetCellg_models_costoa))) == false)
    {
        
client_print_color(idprint_team_default"^4[AMXX]^1 No tienes suficientes^4 Puntos^1 para comprar este modelo.")
        return;
    }
    
Update_Save(id)    
    
client_print_color(idprint_team_default"^4[AMXX]^1 Compraste el modelo:^4 %a"ArrayGetStringHandleg_models_namea))
}

public 
mh_select_model(idmenuitem)
{
    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
(menuitemainfo3""0a);
    
menu_destroy(menu)
    
str_to_num(info);
    
set_model(ida);
    
client_print_color(idprint_team_default"^4[AMXX]^1 Ahora estas usando el modelo:^4 %a"ArrayGetStringHandleg_models_namea))
}

stock set_model(id, const model_id)
{
    if(
model_id 0)
    {
        
rg_reset_user_model(idtrue)
    }
    else
    {
        
rg_set_user_model(idfmt("%a"ArrayGetStringHandleg_modelsmodel_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"0callback_model_select)
    for( new 
ArraySizeg_models) ; i++)
    {
        
num_to_str(inumcharsmax(num))
        if( 
gPCurrentModel[id] == i)
        {
            
menu_additem(menufmt("%a \y[ACTUAL]"ArrayGetStringHandleg_models_namei)), num0callback_model_select);    
        }
        else if( 
g_pModels[id][i])
        {
            
menu_additem(menufmt("%a"ArrayGetStringHandleg_models_namei)), num0callback_model_select);
        }
    }
    
menu_setprop(menuMPROP_EXITMEXIT_ALL)
    
menu_display(idmenu, .time=60)
}
public 
mc_hats_select(idmenuitem)
{
    new 
info[4], a
    menu_item_getinfo
(menuitemainfocharsmax(info), ""0a)
    
str_to_num(info)
    if( 
gPCurrentHat[id] == a)
    {
        return 
ITEM_DISABLED
    
}
    return 
ITEM_ENABLED
}
public 
mc_model_select(idmenuitem)
{
    new 
info[4], a
    menu_item_getinfo
(menuitemainfocharsmax(info), ""0a)
    
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.
Responder
#2
Hola muy buen plugin pero sabes que tira error

Error: Number of arguments does not match definition on line 130
Error: Undefined symbol "fmt" on line 219
Error: Undefined symbol "time" on line 384
Warning: Expression has no effect on line 384
Error: Expected token: ";", but found ")" on line 384
Error: Invalid expression, assumed zero on line 384
Error: Too many error messages on one line on line 384


me podrias ayudar por favor ..

GraciasExcitedeyes
Responder
#3
(24/12/2018, 08:25 PM)Electro2017 escribió: Hola muy buen plugin pero sabes que tira error

Error: Number of arguments does not match definition on line 130
Error: Undefined symbol "fmt" on line 219
Error: Undefined symbol "time" on line 384
Warning: Expression has no effect on line 384
Error: Expected token: ";", but found ")" on line 384
Error: Invalid expression, assumed zero on line 384
Error: Too many error messages on one line on line 384


me podrias ayudar por favor ..

GraciasExcitedeyes

- 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).
Responder
#4
Si lo actualizo ... no se borraran los INC ?

Se puede cambiar de versión de AMXMODX a 1.8.2 ?
Responder
#5
Dejarias el include <REAPI>, ya que lo estoy buscando, sin encontrar..
Responder
#6
Sirve y Compila con 1.9.0 , Buen Aporte .!

Código PHP:
AMX Mod X Compiler 1.9.0.5234
Copyright 
(c1997-2006 ITB CompuPhase
Copyright 
(c2004-2013 AMX Mod X Team

Header size
:           2124 bytes
Code size
:            21580 bytes
Data size
:            23548 bytes
Stack
/heap size:      16384 bytes
Total requirements
:   63636 bytes
Done
.
[
Finished in 2.8s
¿No tienes cuenta en Google? ¿En qué mundo caótico y cruel vives…?
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)