[ZP] Menu de Hats
#1
ACTUALIZADO: 20/11/2022

Hola, les hare una guia/aporte de menu de hats...
Comenzemos!

Paso [ 1 ]
Código PHP:
// ---------------------------
//  ---- MENÚ DE HATS ----
// ---------------------------

#include <amxmodx>
#include <engine>
#include <hamsandwich>

// * Activen este define para que los bots tengan gorritos al azar ;)
#define BOTS_HATS

// Variables que vamos a utilizar
// * g_hat es para guardar el hat elegido por el jugador.
// * g_hat_ent es la entidad del hat que llevará 'puesta' el jugador.
new g_hat[33], g_hat_ent[33];

// El enum donde ponemos los datos que utilizará el menú de hat, declarado en el 'new const' debajo.
// * HAT_NOMBRE[32]: Nombre del Hat
// * HAT_MDL[64]: Modelo del Hat
// * HAT_ACCESO: Acceso para obtener el Hat (en el caso que quieras que utilice un ADMIN)
enum _hats_data
{
    
HAT_NOMBRE[32],
    
HAT_MDL[121],
    
HAT_ACCESO
};

// Aquí modificaremos la lista de Hats que va a aparecer en el menú (su modelo, nombre y acceso).
// * En donde va el modelo si lo dejan vació "" no se utilizará ningún modelo y se 'colocará' un hat invisible.
new const LISTA_DE_HATS[][_hats_data] =
{
    { 
"Ninguno"""ADMIN_ALL /*ADMIN_ALL: es para todos [es decir que los jugadores normales pueden elegirlo]*/ },
    { 
"Bomba""models/zp_hats/bomba.mdl"ADMIN_BAN/*ADMIN_BAN: los admins que tengan acceso al ban podrán usarlo 'd' */ },
    { 
"Caballo""models/zp_hats/horse.mdl"ADMIN_ALL },
    { 
"Vikingo""models/zp_hats/viking.mdl"ADMIN_ALL },
    { 
"Casco Oxidado""models/zp_hats/oxic.mdl"ADMIN_RCON /*ADMIN_RCON: los que tengan acceso al RCON podrán elegirlo 'l' */ }
}; 

Paso [ 2 ]

Agregamos en su función de 'spawn_post' o en la ronda inciada en un loop para todos los jugadores (es preferible spawn_post).
Código PHP:
quitar_hat(id); // En el caso que ya tengamos un HAT lo eliminamos así evitamos que se vayan acumulando entidades.
set_hat(id); // Seteamos el HAT al jugador. 

Quedaria...
Código PHP:
// *SIN ZP SERÍA: [En su ham_spawn_post (lo crean si les falta)]
// -------------------

// * Esta función es la de aparición; es cuando el jugador aparece por primera vez 'está vivo'.
// * No es necesaria para los HATS, tambíen pueden hacerlo en un evento de ronda iniciada con un for( y colocar hats a todos los jugadores en general.
public ham_jspawn_POST(id)
{
    if (!
is_user_alive(id)) // Si el usuario NO esta vivo no le pondremos ningun HAT.
        
return; 

    
quitar_hat(id); // En el caso que ya tengamos un HAT lo eliminamos así evitamos que se vayan acumulando entidades.
    
set_hat(id); // Seteamos el HAT al jugador.    
}

// *CON ZP 4.2 EN ADELANTE:
// --------------------------------
// Ham Player Spawn Post Forward
public fw_PlayerSpawn_Post(id)
{
 
// Not alive or didn't join a team yet
 
if (!is_user_alive(id) || !fm_cs_get_user_team(id))
 return;

 
// Player spawned
 
g_isalive[id] = true;

 
quitar_hat(id); // En el caso que ya tengamos un HAT lo eliminamos así evitamos que se vayan acumulando entidades.
 
set_hat(id); // Seteamos el HAT al jugador.


Paso [ 3 ]
Vamos a plugin_precache() y agregamos el precache de los hats.

Código PHP:
public plugin_precache()
{
    
// * Precacheamos los hats para que no se caiga el sv al colocarlos.
    
for (new 0sizeof (LISTA_DE_HATS); i++)
    {
        if (!
equal(LISTA_DE_HATS[i][HAT_MDL], ""))
            
precache_model(LISTA_DE_HATS[i][HAT_MDL]);
    } 

Quedaria en el ZP 4.3 en adelante de esta forma...
Código PHP:
    //codigo ...

    // Allow registering stuff now
    
g_arrays_created true

    
// Load customization data
    
load_customization_from_files()

    
// * Precacheamos los hats para que no se caiga el sv al colocarlos.
    
for (new 0sizeof (LISTA_DE_HATS); i++)
    {
        if (!
equal(LISTA_DE_HATS[i][HAT_MDL], ""))
        
precache_model(LISTA_DE_HATS[i][HAT_MDL]);
    } 

Paso [ 4 ]
Luego agregamos esto debajo del plugin o en algún lugar donde no interfiera.
Código PHP:
set_hat(id)
{
    
// Si el HAT del jugador no tiene modelo no hay nada que hacer aquí.
    
if (equal(LISTA_DE_HATSg_hat[id] ][HAT_MDL], ""))
        return;

    
// Creamos el HAT al jugador (entidad)
    
g_hat_ent[id] = create_entity("info_target");

    if (!
is_valid_ent(g_hat_ent[id])) // Si el hat no es válido, no hay nada que hacer aquí.
        
return;

    
// * Creamos las caracteristicas del hat (que siga el movimient del jugador y tenga su modelo)    
    
entity_set_int(g_hat_ent[id], EV_INT_movetypeMOVETYPE_FOLLOW)
    
entity_set_edict(g_hat_ent[id], EV_ENT_aimentid);
    
entity_set_model(g_hat_ent[id], LISTA_DE_HATSg_hat[id] ][HAT_MDL]);
}

quitar_hat(id)
{
    if (!
is_valid_ent(g_hat_ent[id])) // Si el hat no es válido, no hay nada que hacer aquí.
        
return false;

    
remove_entity(g_hat_ent[id]); // Removemos el HAT.    
    
return true;

Paso [ 5 ]
Y ahora por ultimo los menus. Esto lo pegan (o lo hacen) al final si quieren.

Código PHP:
// * Creamos el menú de hats.
menu_hats(id)
{
    new 
menumenu menu_create("\yLista de\w HATS\d\R""handler_menu_hats");
    new 
temp[3], mtxt[161];

    for (new 
0sizeof (LISTA_DE_HATS); i++)
    {
        if (
== 0formatex(mtxtcharsmax(mtxt), "\dREMOVER HAT^n");
        else
        {
            if (
g_hat[id] == iformatex(mtxtcharsmax(mtxt), "\w%s \r[\yEQUIPADO\r]"LISTA_DE_HATS[i][HAT_NOMBRE]);
            else if (!(
get_user_flags(id) & LISTA_DE_HATS[i][HAT_ACCESO])) formatex(mtxtcharsmax(mtxt), "\d%s \r[SIN ACCESO]"LISTA_DE_HATS[i][HAT_NOMBRE]);
            else 
formatex(mtxtcharsmax(mtxt), LISTA_DE_HATS[i][HAT_NOMBRE]);
        }

        
num_to_str(itemp2);
        
menu_additem(menumtxttemp);
    }

    
menu_setprop(menuMPROP_BACKNAME"Volver");
    
menu_setprop(menuMPROP_NEXTNAME"Siguiente");
    
menu_setprop(menuMPROP_EXITNAME"\rSalir");
    
menu_display(idmenu);
}
public 
handler_menu_hats(idmenuID item)
{
    if (!
is_user_connected(id))
    {
        
menu_destroy(menuID);
        return 
PLUGIN_HANDLED;
    }

    new 
szkey[6], accesocbacknumHATmenu_item_getinfo(menuIDitemaccesoszkeycharsmax(szkey), __cback);
    
numHAT str_to_num(szkey);
    
menu_destroy(menuID);    

    if (!
numHAT)
    {
        if (
item == && quitar_hat(id)) g_hat[id] = 0client_print_color(id0"^4[ZP]^1 Hat removido.");
        return 
PLUGIN_HANDLED;
    }

    if (!(
get_user_flags(id) & LISTA_DE_HATS[numHAT][HAT_ACCESO]))
    {
        
client_print_color(id0"^4[ZP]^1 No tienes el acceso necesario para este hat.");
        return 
PLUGIN_HANDLED;
    }

    
g_hat[id] = numHAT;
    
client_print_color(id0"^4[ZP]^1 Hat:^3 %s^1 Equipado!."LISTA_DE_HATS[numHAT][HAT_NOMBRE]);

    
quitar_hat(id); // En el caso que ya tengamos un HAT lo eliminamos así evitamos que se vayan acumulando entidades.
    
set_hat(id); // Seteamos el HAT al jugador.    

    
return PLUGIN_HANDLED;


Paso [ 6 ]
Para que se abra el menu lo llamaremos si escribimos en el chat (en este caso), /hats o hats
Código PHP:
// Vamos a Client Commands
register_clcmd("say hats""clcmd_hatsmenu");
register_clcmd("say /hats""clcmd_hatsmenu"); 

Quedaria... o si fuera un plugin normal solo en plugin_init agregan abajo de register_plugin esos 2 registers
Código PHP:
// Client commands
 
register_clcmd("say zpmenu""clcmd_saymenu")
 
register_clcmd("say /zpmenu""clcmd_saymenu")
 
register_clcmd("say unstuck""clcmd_sayunstuck")
 
register_clcmd("say /unstuck""clcmd_sayunstuck")
 
register_clcmd("nightvision""clcmd_nightvision")
 
register_clcmd("drop""clcmd_drop")
 
register_clcmd("buyammo1""clcmd_buyammo")
 
register_clcmd("buyammo2""clcmd_buyammo")
 
register_clcmd("chooseteam""clcmd_changeteam")
 
register_clcmd("jointeam""clcmd_changeteam")
 
register_clcmd("say hats""clcmd_hatsmenu");
 
register_clcmd("say /hats""clcmd_hatsmenu"); 
Luego un poco mas abajo de esto o donde prefieran agregan el llamado al clcmd para que les abra el menú.
Código PHP:
// * Registramos el llamado al menú mediante say (chat).
public clcmd_hatsmenu(id)
{
    
menu_hats(id);
    return 
PLUGIN_HANDLED;

Y listo...

.rar   zp_hats.rar (Tamaño: 983.75 KB / Descargas: 53) Models de los Hats

.sma   Descargar AMXX / pl_menu_hats.sma (Tamaño: 5.73 KB / Descargas: 22) Plugin de los Hats sin ZP
___________________________________
SI NECESITAS UN PLUGIN TE LO HAGO $$$
COMUNICATE A MI DISCORD: emanuelitop15
Responder
#2
Guiá claramente no es, no explicas nada, es un aporte seccionado.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)