New hud menu system
#1
Bueno este es un sistema de menu por hud, siempre quise hacer uno cuando era un adolecente pero no tenía la capacidad para poder hacerlo, así que se los comparto. Lo publico más como un aporte que como un plugin porque la idea es que les sea de guía y que hagan las modificaciones que crean necesarias en cuanto a las posiciones del menu y los items.

El sistema utiliza 3 dhud: 1 para el título, X para los items y 1 para las opciones Salir, Volver, Siguiente.

Donde X depende del contenido de los items, mínimo 1 DHUD.

Tiene soporte tanto para menues estáticos como para menues dinámicos.

Natives

Código PHP:
#if defined _hudmenu_included
 #endinput
#endif

#define _hudmenu_included

#include <amxmisc>

// DON'T TOUCH
const KEYSMENU MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0;

#define hud_menu_register(%0,%1) register_menu(%0, KEYSMENU, %1, 1)

// GET MENU INDEX
native hud_menu_get_menu_index(const iClient);

// CREATE MENU TITLE
native hud_menu_create_title(const szText[], const iRed, const iGreen, const iBlue, const Float:fPosX 0.0, const Float:fPosY 0.4);

// DESTROY MENU
native hud_menu_destroy(const iClient, const iStatic);

// GET MENU PAGE
native hud_menu_get_page(const iClient);

// BACK PAGE
native hud_menu_back_page(const iClient);

// NEXT PAGE
native hud_menu_next_page(const iClient);

// GET ITEM INDEX
native hud_menu_get_selected_option(const iClientiKey);

// GET MAX MENU ITEMS
native hud_menu_get_max_items(const iMenu);

// GET MAX MENU ITEMS PER PAGE
native hud_menu_get_page_max_items()

// GET ITEM NAME
native hud_menu_get_item_name(const iMenu, const iItemszItem[], const iItemLenght);

// ADD ITEM TO THE MENU
native hud_menu_additem(const iMenu, const szText[], const szPos[], const iRed 255, const iGreen 255, const iBlue 255);

// DISPLAY MENU
native hud_menu_display(const iClient, const iMenuiPage); 

Ejemplo
Código PHP:
#include <amxmodx>
#include <hudmenu>

#pragma semicolon 1

new g_iStaticHudMenu;

public 
plugin_init(){
 
register_plugin("Testing Hud Menues""1.0""Roccoxx");

 
register_clcmd("say probando""clcmdTest");

 
register_clcmd("say probando2""ShowMenuPlayers");

 
CreateStaticHudMenu();
}

CreateStaticHudMenu(){
 
g_iStaticHudMenu hud_menu_create_title("Quien es el más pijudo?"02550);
 
hud_menu_register("Quien es el más pijudo?""hud_menu_test");

 
hud_menu_additem(g_iStaticHudMenu"Roccoxx""-"25500);
 
hud_menu_additem(g_iStaticHudMenu"Metita""2"02550);
 
hud_menu_additem(g_iStaticHudMenu"Manu""3"255255255);
 
hud_menu_additem(g_iStaticHudMenu"Federicomb""4"00255);
 
hud_menu_additem(g_iStaticHudMenu"Metalicross""5"2552550);
 
hud_menu_additem(g_iStaticHudMenu"Skylar""6"2552550);
 
hud_menu_additem(g_iStaticHudMenu"Hypnotize""7"2552550);
 
hud_menu_additem(g_iStaticHudMenu"Totopizza""8"2552550);
 
hud_menu_additem(g_iStaticHudMenu"Matias_Esf""9"2552550);
 
hud_menu_additem(g_iStaticHudMenu"Hud""10"2552550);
 
hud_menu_additem(g_iStaticHudMenu"Neeeeeeeeeeeeeeeeeel.-""11"2552550);
 
hud_menu_additem(g_iStaticHudMenu"Flys""12"2552550);
 
hud_menu_additem(g_iStaticHudMenu"MarioAR""13"2552550);
 
hud_menu_additem(g_iStaticHudMenu"R0ma'""14"2552550);
 
hud_menu_additem(g_iStaticHudMenu"Kikizon""15"2552550);
}

public 
clcmdTest(const iClient){
 
hud_menu_display(iClientg_iStaticHudMenu0);
}

public 
hud_menu_test(iClientiKey)
{
 if(!
is_user_connected(iClient)){
 
hud_menu_destroy(iClient1);
 return 
PLUGIN_HANDLED;
 }

 if(
iKey == 9){
 
hud_menu_destroy(iClient1);
 return 
PLUGIN_HANDLED;
 }

 if(
iKey == 7){
 
hud_menu_back_page(iClient);
 return 
PLUGIN_HANDLED;
 }

 if(
iKey == 8){
 
hud_menu_next_page(iClient);
 return 
PLUGIN_HANDLED;
 }

 new 
iMenu hud_menu_get_menu_index(iClient);

 if(
iKey >= hud_menu_get_page_max_items()){
 
hud_menu_display(iClientiMenuhud_menu_get_page(iClient));
 return 
PLUGIN_HANDLED;
 }

 new 
iOption hud_menu_get_selected_option(iClientiKey);

 if(
iOption >= hud_menu_get_max_items(iMenu)){
 
hud_menu_display(iClientiMenuhud_menu_get_page(iClient));
 return 
PLUGIN_HANDLED;
 }

 new 
szItem[100]; hud_menu_get_item_name(iMenuiOptionszItemcharsmax(szItem));

 new 
szName[32]; get_user_name(iClientszNamecharsmax(szName));

 
client_print(0print_chat"%s Elegio la opcion #%d: %s"szNameiOptionszItem);
 
hud_menu_destroy(iClient1);
 return 
PLUGIN_HANDLED;
}

public 
ShowMenuPlayers(const iClient){
 new 
iMenu hud_menu_create_title("Menu de jugadores"2550255);

 
hud_menu_register("Menu de jugadores""MenuPlayers");

 new 
szPos[4], szName[32];
 for(new 
1<= MAX_PLAYERSi++){
 if(!
is_user_connected(i)) continue;

 
get_user_name(iszNamecharsmax(szName));
 
num_to_str(iszPoscharsmax(szPos));
 
hud_menu_additem(iMenuszNameszPos0255255);
 }
 
 
hud_menu_display(iClientiMenu0);
}

public 
MenuPlayers(iClientiKey)
{
 if(!
is_user_connected(iClient)){
 
hud_menu_destroy(iClient0);
 return 
PLUGIN_HANDLED;
 }

 if(
iKey == 9){
 
hud_menu_destroy(iClient0);
 return 
PLUGIN_HANDLED;
 }

 if(
iKey == 7){
 
hud_menu_back_page(iClient);
 return 
PLUGIN_HANDLED;
 }

 if(
iKey == 8){
 
hud_menu_next_page(iClient);
 return 
PLUGIN_HANDLED;
 }

 new 
iMenu hud_menu_get_menu_index(iClient);

 if(
iKey >= hud_menu_get_page_max_items()){
 
hud_menu_display(iClientiMenuhud_menu_get_page(iClient));
 return 
PLUGIN_HANDLED;
 }

 new 
iOption hud_menu_get_selected_option(iClientiKey);

 if(
iOption >= hud_menu_get_max_items(iMenu)){
 
hud_menu_display(iClientiMenuhud_menu_get_page(iClient));
 return 
PLUGIN_HANDLED;
 }

 new 
szItem[100]; hud_menu_get_item_name(iMenuiOptionszItemcharsmax(szItem));
 new 
szName[32]; get_user_name(iClientszNamecharsmax(szName));

 
client_print(0print_chat"%s Elegio al jugador: %s"szNameszItem);
 
hud_menu_destroy(iClient0);
 return 
PLUGIN_HANDLED;


Importante: el titulo de hud_menu_register y hud_menu_create_title debe coincidir!

Creditos:
Matias_Esf -> Por ayudarme a testear
Metalicross -> Por guiarme hacia el sdk del juego para investigar sobre los dhud
r0ma' -> Por las sugerencias <3

Colocar HudMenu.amxx antes de sus plugins que utilizen el menu.

Algunas Imagenes
[Imagen: GglvuCg.jpg]
[Imagen: O1VbVN8.jpg]
[Imagen: XTF9tUi.jpg]


Archivos adjuntos
.sma   Descargar AMXX / HudMenu.sma (Tamaño: 8.85 KB / Descargas: 21)
.sma   Descargar AMXX / TestHudMenu.sma (Tamaño: 4.14 KB / Descargas: 13)
.inc   hudmenu.inc (Tamaño: 1.33 KB / Descargas: 19)
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#2
Tremendo el pihud menu , buen aporte Proud
Responder
#3
wenardo
Responder
#4
Lindo aporte, estaría bueno que se pueda modificar X,Y.
MENU_ITEM_POS no lo usas nunca solo haces el copy :d

Algo así seria para poder modificar X, Y y también que si X es 1.0 ponga los numeros al final del texto:
Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <engine>

#pragma semicolon 1

new const szName[] = "Hud Menu";
new const 
szVersion[] = "1.0";
new const 
szAuthor[] = "Roccoxx";

/* DON'T MODIFY */
#define MAX_LENGHT_TITLE 100
#define MAX_LENGHT_ITEM 60
/* END */

#define MAX_ITEMS_PER_PAGE 4 // MAX 6
#define MAX_MENU_COUNT 100 // 1 MENU PER PLAYER = 33 + Statics MENUES
#define MAX_ITEMS_COUNT 50

/*const Float:fTitlePosX = 0.0;
const Float:fTitlePosy = 0.4;

const Float:fItemPositionX = 0.0;*/
new const Float:fItemPositionYDiff[] = {
    
0.050.080.110.14
};

const 
MENU_NONE = -1;

enum _:MENU_TITLE_DATA
{
    
MENU_TITLE_TEXT[MAX_LENGHT_TITLE],
    
MENU_HANDLER[100],
    
MENU_TITLE_RED,
    
MENU_TITLE_GREEN,
    
MENU_TITLE_BLUE,
    
Float:MENU_POS_X,
    
Float:MENU_POS_Y
}

enum _:MENU_ITEM_DATA
{
    
MENU_ITEM_TEXT[MAX_LENGHT_ITEM],
    
MENU_ITEM_POS[4],
    
MENU_ITEM_RED,
    
MENU_ITEM_GREEN,
    
MENU_ITEM_BLUE
}

new Array:
g_MenuTitle, Array:g_MenuItems[MAX_MENU_COUNT];

new 
g_iMenuCountg_iItemCount[MAX_MENU_COUNT];

new 
g_iMenuDisplay[33] = {-1, ...}, g_iMenuPage[33];

const 
KEYSMENU MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0;

public 
plugin_init(){
    
register_plugin(szNameszVersionszAuthor);

    
g_MenuTitle ArrayCreate(MENU_TITLE_DATA);

    new 
iEnt create_entity("info_target");
    if(
is_valid_ent(iEnt)){
        
RegisterHamFromEntity(Ham_ThinkiEnt"HudMenuEntity");
        
entity_set_float(iEntEV_FL_nextthinkget_gametime() + 5.0);
    }
}

public 
plugin_end(){
    
ArrayDestroy(g_MenuTitle);
    for(new 
iMAX_MENU_COUNTi++) ArrayDestroy(g_MenuItems[i]);
}

public 
plugin_natives(){
    
register_native("hud_menu_get_menu_index""hud_menu_get_menu_index"1);
    
register_native("hud_menu_destroy""hud_menu_destroy"1);
    
register_native("hud_menu_back_page""hud_menu_back_page"1);
    
register_native("hud_menu_next_page""hud_menu_next_page"1);
    
register_native("hud_menu_get_selected_option""hud_menu_get_selected_option"1);
    
register_native("hud_menu_get_max_items""hud_menu_get_max_items"1);
    
register_native("hud_menu_get_item_name""hud_menu_get_item_name"1);
    
register_native("hud_menu_create_title""hud_menu_create_title"1);
    
register_native("hud_menu_additem""hud_menu_additem"1);
    
register_native("hud_menu_display""hud_menu_display"1);
}

public 
client_putinserver(id){
    
g_iMenuDisplay[id] = MENU_NONEg_iMenuPage[id] = 0;
}

public 
hud_menu_back_page(const iClient, const iStatic){
    if(
g_iMenuPage[iClient] > 0hud_menu_display(iClientg_iMenuDisplay[iClient], (g_iMenuPage[iClient]-1));
    else 
hud_menu_destroy(iClientiStatic);
}

public 
hud_menu_next_page(const iClient, const iStatic){
    new 
iPagesCount = (g_iItemCount[g_iMenuDisplay[iClient]] / MAX_ITEMS_PER_PAGE);
    if(
g_iMenuPage[iClient] < iPagesCounthud_menu_display(iClientg_iMenuDisplay[iClient], (g_iMenuPage[iClient]+1));
    else 
hud_menu_destroy(iClientiStatic);
}

public 
hud_menu_get_selected_option(const iClientiKey){
    if(
g_iMenuPage[iClient] > 0iKey = (iKey + (g_iMenuPage[iClient] * MAX_ITEMS_PER_PAGE));

    return 
iKey;
}

public 
hud_menu_destroy(const iClient, const iStatic){
    if(!
iStatic){
        new 
iMenu g_iMenuDisplay[iClient];

        
ArrayDeleteItem(g_MenuTitleiMenu);

        new 
iLastMenu iMenu;

        for(new 
iMenuIndexiMenuIndex MAX_MENU_COUNTiMenuIndex++){
            
// EMPTY MENU
            
if(g_iItemCount[iMenuIndex] == 0) continue;

            if(
iMenuIndex iMenu){
                
iLastMenu iMenuIndex;

                
g_iItemCount[iMenuIndex-1] = g_iItemCount[iMenuIndex];
                
g_MenuItems[iMenuIndex-1] = ArrayClone(g_MenuItems[iMenuIndex]);
            }
        }

        
ArrayDestroy(g_MenuItems[iLastMenu]);
        
g_iItemCount[iLastMenu] = 0;

        for(new 
iPlayers 1iPlayers <= MAX_PLAYERSiPlayers++){
            if(!
is_user_connected(iPlayers) || iClient == iPlayers) continue;

            if(
g_iMenuDisplay[iPlayers] > g_iMenuDisplay[iClient]) g_iMenuDisplay[iPlayers]--;
        }

        
g_iMenuCount--;
    }

    
g_iMenuDisplay[iClient] = MENU_NONEg_iMenuPage[iClient] = 0;
}

public 
hud_menu_get_menu_index(const iClient) return g_iMenuDisplay[iClient];

public 
hud_menu_get_max_items(const iMenu) return g_iItemCount[iMenu];

public 
hud_menu_get_item_name(const iMenu, const iItemszItem[], const iItemLenght){
    new 
iDataItem[MENU_ITEM_DATA]; ArrayGetArray(g_MenuItems[iMenu], iItemiDataItem);

    
param_convert(3); copy(szItemiItemLenghtiDataItem[MENU_ITEM_TEXT]);
}

public 
hud_menu_create_title(const szText[], const iRed, const iGreen, const iBlue, const Float:fPosX, const Float:fPosY){
    if(
g_iMenuCount >= MAX_MENU_COUNT){
        
log_amx("You can create only %d menues!"MAX_MENU_COUNT);
        return 
PLUGIN_HANDLED;
    }

    
param_convert(1);

    if(
strlen(szText) > MAX_LENGHT_TITLE){
        
log_amx("Maximum %d Chracters!"MAX_LENGHT_TITLE);
        return 
PLUGIN_HANDLED;
    }

    new 
iData[MENU_TITLE_DATA];
    
copy(iData[MENU_TITLE_TEXT], charsmax(iData), szText);
    
iData[MENU_TITLE_RED] = iRediData[MENU_TITLE_GREEN] = iGreeniData[MENU_TITLE_BLUE] = iBlue;
    
iData[MENU_POS_X] = fPosX;
    
iData[MENU_POS_Y] = fPosY;
    
    
g_MenuItems[g_iMenuCount] = ArrayCreate(MENU_ITEM_DATA);

    
g_iMenuCount++;
    
    return 
ArrayPushArray(g_MenuTitleiData);
}

public 
hud_menu_additem(const iMenu, const szText[], const szPos[], const iRed, const iGreen, const iBlue){
    if(
g_iItemCount[iMenu] >= MAX_ITEMS_COUNT){
        
log_amx("You can create only %d items per menu!"MAX_ITEMS_COUNT);
        return;
    }

    
param_convert(2);

    if(
strlen(szText) > MAX_LENGHT_ITEM){
        
log_amx("Maximum %d Chracters!"MAX_LENGHT_ITEM);
        return;
    }

    
param_convert(3);

    
g_iItemCount[iMenu]++;

    new 
iData[MENU_ITEM_DATA];
    
copy(iData[MENU_ITEM_TEXT], charsmax(iData), szText); copy(iData[MENU_ITEM_POS], charsmax(iData), szPos);
    
iData[MENU_ITEM_RED] = iRediData[MENU_ITEM_GREEN] = iGreeniData[MENU_ITEM_BLUE] = iBlue;
    
ArrayPushArray(g_MenuItems[iMenu], iData);
}

public 
hud_menu_display(const iClient, const iMenuiPage){
    if(
iPage > (g_iItemCount[iMenu] / MAX_ITEMS_PER_PAGE)) iPage 0;

    
g_iMenuDisplay[iClient] = iMenug_iMenuPage[iClient] = iPage;

    new 
iDataTitle[MENU_TITLE_DATA]; ArrayGetArray(g_MenuTitleiMenuiDataTitle);
    
show_menu(iClientKEYSMENU"^n", -1iDataTitle[MENU_TITLE_TEXT]);
}

ShowHudMenu(const iClient, const iMenu, const iPage){
    static 
iDataTitle[MENU_TITLE_DATA]; ArrayGetArray(g_MenuTitleiMenuiDataTitle);
    
    
set_dhudmessage(iDataTitle[MENU_TITLE_RED], iDataTitle[MENU_TITLE_GREEN], iDataTitle[MENU_TITLE_BLUE], iDataTitle[MENU_POS_X], iDataTitle[MENU_POS_Y], 01.00.10.10.9);
    
show_dhudmessage(iClientiDataTitle[MENU_TITLE_TEXT]);

    static 
iStartiStart = (MAX_ITEMS_PER_PAGE iPage); static iEndiEnd = (MAX_ITEMS_PER_PAGE * (iPage 1));
    if(
iEnd g_iItemCount[iMenu]) iEnd g_iItemCount[iMenu];

    static 
iDataItem[MENU_ITEM_DATA], iPositioniPosition 0;

    static 
i;
    for(
iStartiEndi++){
        
ArrayGetArray(g_MenuItems[iMenu], iiDataItem);

        
set_dhudmessage(iDataItem[MENU_ITEM_RED], iDataItem[MENU_ITEM_GREEN], iDataItem[MENU_ITEM_BLUE], iDataTitle[MENU_POS_X], iDataTitle[MENU_POS_Y]+fItemPositionYDiff[iPosition], 01.00.10.11.0);
        if(
iDataTitle[MENU_POS_X] == 1.0)
            
show_dhudmessage(iClient"^n%s %d"iDataItem[MENU_ITEM_TEXT], iPosition+1);
        else
            
show_dhudmessage(iClient"^n%d %s"iPosition+1iDataItem[MENU_ITEM_TEXT]);
        
iPosition++;
    }

    static 
iPagesCountiPagesCount = (g_iItemCount[iMenu] / MAX_ITEMS_PER_PAGE);

    static 
szBuffer[40];
    if(
iDataTitle[MENU_POS_X] == 1.0) {
        
formatex(szBuffercharsmax(szBuffer), "EXIT 0");

        if(
iPage 0format(szBuffercharsmax(szBuffer), "%s^nBACK 8"szBuffer);
        if(
iPage iPagesCountformat(szBuffercharsmax(szBuffer), "%s^nNEXT 9"szBuffer);
    }
    else {
        
formatex(szBuffercharsmax(szBuffer), "0 EXIT");

        if(
iPage 0format(szBuffercharsmax(szBuffer), "%s^n8 BACK"szBuffer);
        if(
iPage iPagesCountformat(szBuffercharsmax(szBuffer), "%s^n9 NEXT"szBuffer);
    }
    
    
set_dhudmessage(255255255iDataTitle[MENU_POS_X], iDataTitle[MENU_POS_Y] + fItemPositionYDiff[iPosition-1] + 0.101.00.10.11.0);
    
show_dhudmessage(iClientszBuffer);
}

public 
HudMenuEntity(const iEnt){
    if(!
is_valid_ent(iEnt)) return HAM_IGNORED;

    for(new 
iClient 1iClient <= MAX_PLAYERSiClient++){
        if(!
is_user_connected(iClient) || g_iMenuDisplay[iClient] == MENU_NONE) continue;

        
ShowHudMenu(iClientg_iMenuDisplay[iClient], g_iMenuPage[iClient]);
    }

    
entity_set_float(iEntEV_FL_nextthinkget_gametime() + 1.0);
    return 
HAM_IGNORED;

y la native:
Código PHP:
native hud_menu_create_title(const szText[], const iRed 255, const iGreen 255, const iBlue 255, const Float:fPosX 0.0, const Float:fPosY=0.4); 

Lo unico que si fPosY es mayor a 0.6-0.7 aprox se van a empezar a pisar los hud.
[Imagen: giphy.webp]

Panda Nuestro
Sistema de Cuentas MySQL/SQLite
Discord: FluffyDeveloper#4753

meTaLiCroSS escribió: Pero sin picarse po, todavía te molesta que te haya mandado a la mierda porque querias plugins de mi server? Mírate, seguí programando weas mulas después de años, tení que ser harto penca para esta wea, das pura pena Corazón

(22/01/2021, 02:55 PM)Skylar escribió: dios como me enferma que digas plugins cuando hablas de un solo plugin pendejo re pelotudo
Responder
#5
Buenos pijudos jajajaa. Buen aporte.
[Imagen: 76561198350936449.png]

Cita:Los precios en la moneda venezolana se fijarán a partir de la reconversión monetaria y valdrá mucho menos de lo que cuesta una Cachapa con queso.
Responder
#6
Muy bueno, eso significa que tenés la pija grande.
Responder
#7
(15/09/2020, 08:57 PM)r0ma escribió: Lindo aporte, estaría bueno que se pueda modificar X,Y.
MENU_ITEM_POS no lo usas nunca solo haces el copy :d

Algo así seria para poder modificar X, Y y también que si X es 1.0 ponga los numeros al final del texto:
Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <engine>

#pragma semicolon 1

new const szName[] = "Hud Menu";
new const 
szVersion[] = "1.0";
new const 
szAuthor[] = "Roccoxx";

/* DON'T MODIFY */
#define MAX_LENGHT_TITLE 100
#define MAX_LENGHT_ITEM 60
/* END */

#define MAX_ITEMS_PER_PAGE 4 // MAX 6
#define MAX_MENU_COUNT 100 // 1 MENU PER PLAYER = 33 + Statics MENUES
#define MAX_ITEMS_COUNT 50

/*const Float:fTitlePosX = 0.0;
const Float:fTitlePosy = 0.4;

const Float:fItemPositionX = 0.0;*/
new const Float:fItemPositionYDiff[] = {
 
0.050.080.110.14
};

const 
MENU_NONE = -1;

enum _:MENU_TITLE_DATA
{
 
MENU_TITLE_TEXT[MAX_LENGHT_TITLE],
 
MENU_HANDLER[100],
 
MENU_TITLE_RED,
 
MENU_TITLE_GREEN,
 
MENU_TITLE_BLUE,
 
Float:MENU_POS_X,
 
Float:MENU_POS_Y
}

enum _:MENU_ITEM_DATA
{
 
MENU_ITEM_TEXT[MAX_LENGHT_ITEM],
 
MENU_ITEM_POS[4],
 
MENU_ITEM_RED,
 
MENU_ITEM_GREEN,
 
MENU_ITEM_BLUE
}

new Array:
g_MenuTitle, Array:g_MenuItems[MAX_MENU_COUNT];

new 
g_iMenuCountg_iItemCount[MAX_MENU_COUNT];

new 
g_iMenuDisplay[33] = {-1, ...}, g_iMenuPage[33];

const 
KEYSMENU MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0;

public 
plugin_init(){
 
register_plugin(szNameszVersionszAuthor);

 
g_MenuTitle ArrayCreate(MENU_TITLE_DATA);

 new 
iEnt create_entity("info_target");
 if(
is_valid_ent(iEnt)){
 
RegisterHamFromEntity(Ham_ThinkiEnt"HudMenuEntity");
 
entity_set_float(iEntEV_FL_nextthinkget_gametime() + 5.0);
 }
}

public 
plugin_end(){
 
ArrayDestroy(g_MenuTitle);
 for(new 
iMAX_MENU_COUNTi++) ArrayDestroy(g_MenuItems[i]);
}

public 
plugin_natives(){
 
register_native("hud_menu_get_menu_index""hud_menu_get_menu_index"1);
 
register_native("hud_menu_destroy""hud_menu_destroy"1);
 
register_native("hud_menu_back_page""hud_menu_back_page"1);
 
register_native("hud_menu_next_page""hud_menu_next_page"1);
 
register_native("hud_menu_get_selected_option""hud_menu_get_selected_option"1);
 
register_native("hud_menu_get_max_items""hud_menu_get_max_items"1);
 
register_native("hud_menu_get_item_name""hud_menu_get_item_name"1);
 
register_native("hud_menu_create_title""hud_menu_create_title"1);
 
register_native("hud_menu_additem""hud_menu_additem"1);
 
register_native("hud_menu_display""hud_menu_display"1);
}

public 
client_putinserver(id){
 
g_iMenuDisplay[id] = MENU_NONEg_iMenuPage[id] = 0;
}

public 
hud_menu_back_page(const iClient, const iStatic){
 if(
g_iMenuPage[iClient] > 0hud_menu_display(iClientg_iMenuDisplay[iClient], (g_iMenuPage[iClient]-1));
 else 
hud_menu_destroy(iClientiStatic);
}

public 
hud_menu_next_page(const iClient, const iStatic){
 new 
iPagesCount = (g_iItemCount[g_iMenuDisplay[iClient]] / MAX_ITEMS_PER_PAGE);
 if(
g_iMenuPage[iClient] < iPagesCounthud_menu_display(iClientg_iMenuDisplay[iClient], (g_iMenuPage[iClient]+1));
 else 
hud_menu_destroy(iClientiStatic);
}

public 
hud_menu_get_selected_option(const iClientiKey){
 if(
g_iMenuPage[iClient] > 0iKey = (iKey + (g_iMenuPage[iClient] * MAX_ITEMS_PER_PAGE));

 return 
iKey;
}

public 
hud_menu_destroy(const iClient, const iStatic){
 if(!
iStatic){
 new 
iMenu g_iMenuDisplay[iClient];

 
ArrayDeleteItem(g_MenuTitleiMenu);

 new 
iLastMenu iMenu;

 for(new 
iMenuIndexiMenuIndex MAX_MENU_COUNTiMenuIndex++){
 
// EMPTY MENU
 
if(g_iItemCount[iMenuIndex] == 0) continue;

 if(
iMenuIndex iMenu){
 
iLastMenu iMenuIndex;

 
g_iItemCount[iMenuIndex-1] = g_iItemCount[iMenuIndex];
 
g_MenuItems[iMenuIndex-1] = ArrayClone(g_MenuItems[iMenuIndex]);
 }
 }

 
ArrayDestroy(g_MenuItems[iLastMenu]);
 
g_iItemCount[iLastMenu] = 0;

 for(new 
iPlayers 1iPlayers <= MAX_PLAYERSiPlayers++){
 if(!
is_user_connected(iPlayers) || iClient == iPlayers) continue;

 if(
g_iMenuDisplay[iPlayers] > g_iMenuDisplay[iClient]) g_iMenuDisplay[iPlayers]--;
 }

 
g_iMenuCount--;
 }

 
g_iMenuDisplay[iClient] = MENU_NONEg_iMenuPage[iClient] = 0;
}

public 
hud_menu_get_menu_index(const iClient) return g_iMenuDisplay[iClient];

public 
hud_menu_get_max_items(const iMenu) return g_iItemCount[iMenu];

public 
hud_menu_get_item_name(const iMenu, const iItemszItem[], const iItemLenght){
 new 
iDataItem[MENU_ITEM_DATA]; ArrayGetArray(g_MenuItems[iMenu], iItemiDataItem);

 
param_convert(3); copy(szItemiItemLenghtiDataItem[MENU_ITEM_TEXT]);
}

public 
hud_menu_create_title(const szText[], const iRed, const iGreen, const iBlue, const Float:fPosX, const Float:fPosY){
 if(
g_iMenuCount >= MAX_MENU_COUNT){
 
log_amx("You can create only %d menues!"MAX_MENU_COUNT);
 return 
PLUGIN_HANDLED;
 }

 
param_convert(1);

 if(
strlen(szText) > MAX_LENGHT_TITLE){
 
log_amx("Maximum %d Chracters!"MAX_LENGHT_TITLE);
 return 
PLUGIN_HANDLED;
 }

 new 
iData[MENU_TITLE_DATA];
 
copy(iData[MENU_TITLE_TEXT], charsmax(iData), szText);
 
iData[MENU_TITLE_RED] = iRediData[MENU_TITLE_GREEN] = iGreeniData[MENU_TITLE_BLUE] = iBlue;
 
iData[MENU_POS_X] = fPosX;
 
iData[MENU_POS_Y] = fPosY;
 
 
g_MenuItems[g_iMenuCount] = ArrayCreate(MENU_ITEM_DATA);

 
g_iMenuCount++;
 
 return 
ArrayPushArray(g_MenuTitleiData);
}

public 
hud_menu_additem(const iMenu, const szText[], const szPos[], const iRed, const iGreen, const iBlue){
 if(
g_iItemCount[iMenu] >= MAX_ITEMS_COUNT){
 
log_amx("You can create only %d items per menu!"MAX_ITEMS_COUNT);
 return;
 }

 
param_convert(2);

 if(
strlen(szText) > MAX_LENGHT_ITEM){
 
log_amx("Maximum %d Chracters!"MAX_LENGHT_ITEM);
 return;
 }

 
param_convert(3);

 
g_iItemCount[iMenu]++;

 new 
iData[MENU_ITEM_DATA];
 
copy(iData[MENU_ITEM_TEXT], charsmax(iData), szText); copy(iData[MENU_ITEM_POS], charsmax(iData), szPos);
 
iData[MENU_ITEM_RED] = iRediData[MENU_ITEM_GREEN] = iGreeniData[MENU_ITEM_BLUE] = iBlue;
 
ArrayPushArray(g_MenuItems[iMenu], iData);
}

public 
hud_menu_display(const iClient, const iMenuiPage){
 if(
iPage > (g_iItemCount[iMenu] / MAX_ITEMS_PER_PAGE)) iPage 0;

 
g_iMenuDisplay[iClient] = iMenug_iMenuPage[iClient] = iPage;

 new 
iDataTitle[MENU_TITLE_DATA]; ArrayGetArray(g_MenuTitleiMenuiDataTitle);
 
show_menu(iClientKEYSMENU"^n", -1iDataTitle[MENU_TITLE_TEXT]);
}

ShowHudMenu(const iClient, const iMenu, const iPage){
 static 
iDataTitle[MENU_TITLE_DATA]; ArrayGetArray(g_MenuTitleiMenuiDataTitle);
 
 
set_dhudmessage(iDataTitle[MENU_TITLE_RED], iDataTitle[MENU_TITLE_GREEN], iDataTitle[MENU_TITLE_BLUE], iDataTitle[MENU_POS_X], iDataTitle[MENU_POS_Y], 01.00.10.10.9);
 
show_dhudmessage(iClientiDataTitle[MENU_TITLE_TEXT]);

 static 
iStartiStart = (MAX_ITEMS_PER_PAGE iPage); static iEndiEnd = (MAX_ITEMS_PER_PAGE * (iPage 1));
 if(
iEnd g_iItemCount[iMenu]) iEnd g_iItemCount[iMenu];

 static 
iDataItem[MENU_ITEM_DATA], iPositioniPosition 0;

 static 
i;
 for(
iStartiEndi++){
 
ArrayGetArray(g_MenuItems[iMenu], iiDataItem);

 
set_dhudmessage(iDataItem[MENU_ITEM_RED], iDataItem[MENU_ITEM_GREEN], iDataItem[MENU_ITEM_BLUE], iDataTitle[MENU_POS_X], iDataTitle[MENU_POS_Y]+fItemPositionYDiff[iPosition], 01.00.10.11.0);
 if(
iDataTitle[MENU_POS_X] == 1.0)
 
show_dhudmessage(iClient"^n%s %d"iDataItem[MENU_ITEM_TEXT], iPosition+1);
 else
 
show_dhudmessage(iClient"^n%d %s"iPosition+1iDataItem[MENU_ITEM_TEXT]);
 
iPosition++;
 }

 static 
iPagesCountiPagesCount = (g_iItemCount[iMenu] / MAX_ITEMS_PER_PAGE);

 static 
szBuffer[40];
 if(
iDataTitle[MENU_POS_X] == 1.0) {
 
formatex(szBuffercharsmax(szBuffer), "EXIT 0");

 if(
iPage 0format(szBuffercharsmax(szBuffer), "%s^nBACK 8"szBuffer);
 if(
iPage iPagesCountformat(szBuffercharsmax(szBuffer), "%s^nNEXT 9"szBuffer);
 }
 else {
 
formatex(szBuffercharsmax(szBuffer), "0 EXIT");

 if(
iPage 0format(szBuffercharsmax(szBuffer), "%s^n8 BACK"szBuffer);
 if(
iPage iPagesCountformat(szBuffercharsmax(szBuffer), "%s^n9 NEXT"szBuffer);
 }
 
 
set_dhudmessage(255255255iDataTitle[MENU_POS_X], iDataTitle[MENU_POS_Y] + fItemPositionYDiff[iPosition-1] + 0.101.00.10.11.0);
 
show_dhudmessage(iClientszBuffer);
}

public 
HudMenuEntity(const iEnt){
 if(!
is_valid_ent(iEnt)) return HAM_IGNORED;

 for(new 
iClient 1iClient <= MAX_PLAYERSiClient++){
 if(!
is_user_connected(iClient) || g_iMenuDisplay[iClient] == MENU_NONE) continue;

 
ShowHudMenu(iClientg_iMenuDisplay[iClient], g_iMenuPage[iClient]);
 }

 
entity_set_float(iEntEV_FL_nextthinkget_gametime() + 1.0);
 return 
HAM_IGNORED;

y la native:
Código PHP:
native hud_menu_create_title(const szText[], const iRed 255, const iGreen 255, const iBlue 255, const Float:fPosX 0.0, const Float:fPosY=0.4); 

Lo unico que si fPosY es mayor a 0.6-0.7 aprox se van a empezar a pisar los hud.

Actualizado muchas gracias Meliodas :3
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#8
Muy buen aporte.

PD: La posición de los DHUD puede variar dependiendo de la resolución que el usuario tenga?, ya que hace tiempo hice un plugin donde uní 3 DHUD y según mi resolución los veía perfecto, pero un amigo lo veía corrido (hice una frase simulando espacios entre las palabras, y cada palabra tenia un color diferente).
Responder
#9
(15/09/2020, 10:02 PM)Zeta escribió: Muy buen aporte.

PD: La posición de los DHUD puede variar dependiendo de la resolución que el usuario tenga?, ya que hace tiempo hice un plugin donde uní 3 DHUD y según mi resolución los veía perfecto, pero un amigo lo veía corrido (hice una frase simulando espacios entre las palabras, y cada palabra tenia un color diferente).

Si puede variar.
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#10
buen aporte
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#11
(16/09/2020, 12:04 AM)Hypnotize escribió: buen aporte

pd: obvio q gano yo entre esos maniseros

Responder
#12
voten por mi banda!
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#13
(15/09/2020, 08:08 PM)LeanPPP escribió: Tremendo el pihud menu , buen aporte  Proud
(12/03/2014, 08:11 PM)roccoxx escribió: jajajajajajajajajajajajajajajaajajajajajaajajajajajajajajajajajajajajajajajajajajajajajajajjajajjajajajajaja

todo eso elevado a la quinta potencia.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)