Mensajes: 3,020
Temas: 49
Registro en: Oct 2013
Reputación:
33
15/09/2020, 07:52 PM
(Última modificación: 16/09/2020, 10:27 AM por roccoxx . Edited 11 times in total.)
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 iClient , iKey ); // 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 iItem , szItem [], 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 iMenu , iPage );
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?" , 0 , 255 , 0 ); hud_menu_register ( "Quien es el más pijudo?" , "hud_menu_test" ); hud_menu_additem ( g_iStaticHudMenu , "Roccoxx" , "-" , 255 , 0 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Metita" , "2" , 0 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Manu" , "3" , 255 , 255 , 255 ); hud_menu_additem ( g_iStaticHudMenu , "Federicomb" , "4" , 0 , 0 , 255 ); hud_menu_additem ( g_iStaticHudMenu , "Metalicross" , "5" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Skylar" , "6" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Hypnotize" , "7" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Totopizza" , "8" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Matias_Esf" , "9" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Hud" , "10" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Neeeeeeeeeeeeeeeeeel.-" , "11" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Flys" , "12" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "MarioAR" , "13" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "R0ma'" , "14" , 255 , 255 , 0 ); hud_menu_additem ( g_iStaticHudMenu , "Kikizon" , "15" , 255 , 255 , 0 ); } public clcmdTest (const iClient ){ hud_menu_display ( iClient , g_iStaticHudMenu , 0 ); } public hud_menu_test ( iClient , iKey ) { if(! is_user_connected ( iClient )){ hud_menu_destroy ( iClient , 1 ); return PLUGIN_HANDLED ; } if( iKey == 9 ){ hud_menu_destroy ( iClient , 1 ); 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 ( iClient , iMenu , hud_menu_get_page ( iClient )); return PLUGIN_HANDLED ; } new iOption = hud_menu_get_selected_option ( iClient , iKey ); if( iOption >= hud_menu_get_max_items ( iMenu )){ hud_menu_display ( iClient , iMenu , hud_menu_get_page ( iClient )); return PLUGIN_HANDLED ; } new szItem [ 100 ]; hud_menu_get_item_name ( iMenu , iOption , szItem , charsmax ( szItem )); new szName [ 32 ]; get_user_name ( iClient , szName , charsmax ( szName )); client_print ( 0 , print_chat , "%s Elegio la opcion #%d: %s" , szName , iOption , szItem ); hud_menu_destroy ( iClient , 1 ); return PLUGIN_HANDLED ; } public ShowMenuPlayers (const iClient ){ new iMenu = hud_menu_create_title ( "Menu de jugadores" , 255 , 0 , 255 ); hud_menu_register ( "Menu de jugadores" , "MenuPlayers" ); new szPos [ 4 ], szName [ 32 ]; for(new i = 1 ; i <= MAX_PLAYERS ; i ++){ if(! is_user_connected ( i )) continue; get_user_name ( i , szName , charsmax ( szName )); num_to_str ( i , szPos , charsmax ( szPos )); hud_menu_additem ( iMenu , szName , szPos , 0 , 255 , 255 ); } hud_menu_display ( iClient , iMenu , 0 ); } public MenuPlayers ( iClient , iKey ) { if(! is_user_connected ( iClient )){ hud_menu_destroy ( iClient , 0 ); return PLUGIN_HANDLED ; } if( iKey == 9 ){ hud_menu_destroy ( iClient , 0 ); 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 ( iClient , iMenu , hud_menu_get_page ( iClient )); return PLUGIN_HANDLED ; } new iOption = hud_menu_get_selected_option ( iClient , iKey ); if( iOption >= hud_menu_get_max_items ( iMenu )){ hud_menu_display ( iClient , iMenu , hud_menu_get_page ( iClient )); return PLUGIN_HANDLED ; } new szItem [ 100 ]; hud_menu_get_item_name ( iMenu , iOption , szItem , charsmax ( szItem )); new szName [ 32 ]; get_user_name ( iClient , szName , charsmax ( szName )); client_print ( 0 , print_chat , "%s Elegio al jugador: %s" , szName , szItem ); hud_menu_destroy ( iClient , 0 ); 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
Archivos adjuntos
Descargar AMXX / HudMenu.sma (Tamaño: 8.85 KB / Descargas: 21)
Descargar AMXX / TestHudMenu.sma (Tamaño: 4.14 KB / Descargas: 13)
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.
Mensajes: 128
Temas: 23
Registro en: Jun 2017
Reputación:
4
Tremendo el pihud menu , buen aporte
Mensajes: 3,077
Temas: 33
Registro en: May 2017
Reputación:
34
Mensajes: 181
Temas: 3
Registro en: Oct 2013
Reputación:
15
15/09/2020, 08:57 PM
(Última modificación: 15/09/2020, 09:09 PM por r0ma' . Edited 2 times in total.)
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.05 , 0.08 , 0.11 , 0.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_iMenuCount , g_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 ( szName , szVersion , szAuthor ); g_MenuTitle = ArrayCreate ( MENU_TITLE_DATA ); new iEnt = create_entity ( "info_target" ); if( is_valid_ent ( iEnt )){ RegisterHamFromEntity ( Ham_Think , iEnt , "HudMenuEntity" ); entity_set_float ( iEnt , EV_FL_nextthink , get_gametime () + 5.0 ); } } public plugin_end (){ ArrayDestroy ( g_MenuTitle ); for(new i ; i < MAX_MENU_COUNT ; i ++) 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_NONE ; g_iMenuPage [ id ] = 0 ; } public hud_menu_back_page (const iClient , const iStatic ){ if( g_iMenuPage [ iClient ] > 0 ) hud_menu_display ( iClient , g_iMenuDisplay [ iClient ], ( g_iMenuPage [ iClient ]- 1 )); else hud_menu_destroy ( iClient , iStatic ); } public hud_menu_next_page (const iClient , const iStatic ){ new iPagesCount = ( g_iItemCount [ g_iMenuDisplay [ iClient ]] / MAX_ITEMS_PER_PAGE ); if( g_iMenuPage [ iClient ] < iPagesCount ) hud_menu_display ( iClient , g_iMenuDisplay [ iClient ], ( g_iMenuPage [ iClient ]+ 1 )); else hud_menu_destroy ( iClient , iStatic ); } public hud_menu_get_selected_option (const iClient , iKey ){ if( g_iMenuPage [ iClient ] > 0 ) iKey = ( 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_MenuTitle , iMenu ); new iLastMenu = iMenu ; for(new iMenuIndex ; iMenuIndex < MAX_MENU_COUNT ; iMenuIndex ++){ // 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 = 1 ; iPlayers <= MAX_PLAYERS ; iPlayers ++){ if(! is_user_connected ( iPlayers ) || iClient == iPlayers ) continue; if( g_iMenuDisplay [ iPlayers ] > g_iMenuDisplay [ iClient ]) g_iMenuDisplay [ iPlayers ]--; } g_iMenuCount --; } g_iMenuDisplay [ iClient ] = MENU_NONE ; g_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 iItem , szItem [], const iItemLenght ){ new iDataItem [ MENU_ITEM_DATA ]; ArrayGetArray ( g_MenuItems [ iMenu ], iItem , iDataItem ); param_convert ( 3 ); copy ( szItem , iItemLenght , iDataItem [ 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 ] = iRed ; iData [ MENU_TITLE_GREEN ] = iGreen ; iData [ 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_MenuTitle , iData ); } 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 ] = iRed ; iData [ MENU_ITEM_GREEN ] = iGreen ; iData [ MENU_ITEM_BLUE ] = iBlue ; ArrayPushArray ( g_MenuItems [ iMenu ], iData ); } public hud_menu_display (const iClient , const iMenu , iPage ){ if( iPage > ( g_iItemCount [ iMenu ] / MAX_ITEMS_PER_PAGE )) iPage = 0 ; g_iMenuDisplay [ iClient ] = iMenu ; g_iMenuPage [ iClient ] = iPage ; new iDataTitle [ MENU_TITLE_DATA ]; ArrayGetArray ( g_MenuTitle , iMenu , iDataTitle ); show_menu ( iClient , KEYSMENU , "^n" , - 1 , iDataTitle [ MENU_TITLE_TEXT ]); } ShowHudMenu (const iClient , const iMenu , const iPage ){ static iDataTitle [ MENU_TITLE_DATA ]; ArrayGetArray ( g_MenuTitle , iMenu , iDataTitle ); set_dhudmessage ( iDataTitle [ MENU_TITLE_RED ], iDataTitle [ MENU_TITLE_GREEN ], iDataTitle [ MENU_TITLE_BLUE ], iDataTitle [ MENU_POS_X ], iDataTitle [ MENU_POS_Y ], 0 , 1.0 , 0.1 , 0.1 , 0.9 ); show_dhudmessage ( iClient , iDataTitle [ MENU_TITLE_TEXT ]); static iStart ; iStart = ( MAX_ITEMS_PER_PAGE * iPage ); static iEnd ; iEnd = ( MAX_ITEMS_PER_PAGE * ( iPage + 1 )); if( iEnd > g_iItemCount [ iMenu ]) iEnd = g_iItemCount [ iMenu ]; static iDataItem [ MENU_ITEM_DATA ], iPosition ; iPosition = 0 ; static i ; for( i = iStart ; i < iEnd ; i ++){ ArrayGetArray ( g_MenuItems [ iMenu ], i , iDataItem ); set_dhudmessage ( iDataItem [ MENU_ITEM_RED ], iDataItem [ MENU_ITEM_GREEN ], iDataItem [ MENU_ITEM_BLUE ], iDataTitle [ MENU_POS_X ], iDataTitle [ MENU_POS_Y ]+ fItemPositionYDiff [ iPosition ], 0 , 1.0 , 0.1 , 0.1 , 1.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 + 1 , iDataItem [ MENU_ITEM_TEXT ]); iPosition ++; } static iPagesCount ; iPagesCount = ( g_iItemCount [ iMenu ] / MAX_ITEMS_PER_PAGE ); static szBuffer [ 40 ]; if( iDataTitle [ MENU_POS_X ] == 1.0 ) { formatex ( szBuffer , charsmax ( szBuffer ), "EXIT 0" ); if( iPage > 0 ) format ( szBuffer , charsmax ( szBuffer ), "%s^nBACK 8" , szBuffer ); if( iPage < iPagesCount ) format ( szBuffer , charsmax ( szBuffer ), "%s^nNEXT 9" , szBuffer ); } else { formatex ( szBuffer , charsmax ( szBuffer ), "0 EXIT" ); if( iPage > 0 ) format ( szBuffer , charsmax ( szBuffer ), "%s^n8 BACK" , szBuffer ); if( iPage < iPagesCount ) format ( szBuffer , charsmax ( szBuffer ), "%s^n9 NEXT" , szBuffer ); } set_dhudmessage ( 255 , 255 , 255 , iDataTitle [ MENU_POS_X ], iDataTitle [ MENU_POS_Y ] + fItemPositionYDiff [ iPosition - 1 ] + 0.1 , 0 , 1.0 , 0.1 , 0.1 , 1.0 ); show_dhudmessage ( iClient , szBuffer ); } public HudMenuEntity (const iEnt ){ if(! is_valid_ent ( iEnt )) return HAM_IGNORED ; for(new iClient = 1 ; iClient <= MAX_PLAYERS ; iClient ++){ if(! is_user_connected ( iClient ) || g_iMenuDisplay [ iClient ] == MENU_NONE ) continue; ShowHudMenu ( iClient , g_iMenuDisplay [ iClient ], g_iMenuPage [ iClient ]); } entity_set_float ( iEnt , EV_FL_nextthink , get_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.
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
Mensajes: 940
Temas: 29
Registro en: Sep 2016
Reputación:
7
Buenos pijudos jajajaa. Buen aporte.
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.
Mensajes: 375
Temas: 55
Registro en: Jan 2016
Reputación:
9
Muy bueno, eso significa que tenés la pija grande.
Mensajes: 3,020
Temas: 49
Registro en: Oct 2013
Reputación:
33
(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.05 , 0.08 , 0.11 , 0.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_iMenuCount , g_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 ( szName , szVersion , szAuthor ); g_MenuTitle = ArrayCreate ( MENU_TITLE_DATA ); new iEnt = create_entity ( "info_target" ); if( is_valid_ent ( iEnt )){ RegisterHamFromEntity ( Ham_Think , iEnt , "HudMenuEntity" ); entity_set_float ( iEnt , EV_FL_nextthink , get_gametime () + 5.0 ); } } public plugin_end (){ ArrayDestroy ( g_MenuTitle ); for(new i ; i < MAX_MENU_COUNT ; i ++) 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_NONE ; g_iMenuPage [ id ] = 0 ; } public hud_menu_back_page (const iClient , const iStatic ){ if( g_iMenuPage [ iClient ] > 0 ) hud_menu_display ( iClient , g_iMenuDisplay [ iClient ], ( g_iMenuPage [ iClient ]- 1 )); else hud_menu_destroy ( iClient , iStatic ); } public hud_menu_next_page (const iClient , const iStatic ){ new iPagesCount = ( g_iItemCount [ g_iMenuDisplay [ iClient ]] / MAX_ITEMS_PER_PAGE ); if( g_iMenuPage [ iClient ] < iPagesCount ) hud_menu_display ( iClient , g_iMenuDisplay [ iClient ], ( g_iMenuPage [ iClient ]+ 1 )); else hud_menu_destroy ( iClient , iStatic ); } public hud_menu_get_selected_option (const iClient , iKey ){ if( g_iMenuPage [ iClient ] > 0 ) iKey = ( 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_MenuTitle , iMenu ); new iLastMenu = iMenu ; for(new iMenuIndex ; iMenuIndex < MAX_MENU_COUNT ; iMenuIndex ++){ // 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 = 1 ; iPlayers <= MAX_PLAYERS ; iPlayers ++){ if(! is_user_connected ( iPlayers ) || iClient == iPlayers ) continue; if( g_iMenuDisplay [ iPlayers ] > g_iMenuDisplay [ iClient ]) g_iMenuDisplay [ iPlayers ]--; } g_iMenuCount --; } g_iMenuDisplay [ iClient ] = MENU_NONE ; g_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 iItem , szItem [], const iItemLenght ){ new iDataItem [ MENU_ITEM_DATA ]; ArrayGetArray ( g_MenuItems [ iMenu ], iItem , iDataItem ); param_convert ( 3 ); copy ( szItem , iItemLenght , iDataItem [ 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 ] = iRed ; iData [ MENU_TITLE_GREEN ] = iGreen ; iData [ 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_MenuTitle , iData ); } 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 ] = iRed ; iData [ MENU_ITEM_GREEN ] = iGreen ; iData [ MENU_ITEM_BLUE ] = iBlue ; ArrayPushArray ( g_MenuItems [ iMenu ], iData ); } public hud_menu_display (const iClient , const iMenu , iPage ){ if( iPage > ( g_iItemCount [ iMenu ] / MAX_ITEMS_PER_PAGE )) iPage = 0 ; g_iMenuDisplay [ iClient ] = iMenu ; g_iMenuPage [ iClient ] = iPage ; new iDataTitle [ MENU_TITLE_DATA ]; ArrayGetArray ( g_MenuTitle , iMenu , iDataTitle ); show_menu ( iClient , KEYSMENU , "^n" , - 1 , iDataTitle [ MENU_TITLE_TEXT ]); } ShowHudMenu (const iClient , const iMenu , const iPage ){ static iDataTitle [ MENU_TITLE_DATA ]; ArrayGetArray ( g_MenuTitle , iMenu , iDataTitle ); set_dhudmessage ( iDataTitle [ MENU_TITLE_RED ], iDataTitle [ MENU_TITLE_GREEN ], iDataTitle [ MENU_TITLE_BLUE ], iDataTitle [ MENU_POS_X ], iDataTitle [ MENU_POS_Y ], 0 , 1.0 , 0.1 , 0.1 , 0.9 ); show_dhudmessage ( iClient , iDataTitle [ MENU_TITLE_TEXT ]); static iStart ; iStart = ( MAX_ITEMS_PER_PAGE * iPage ); static iEnd ; iEnd = ( MAX_ITEMS_PER_PAGE * ( iPage + 1 )); if( iEnd > g_iItemCount [ iMenu ]) iEnd = g_iItemCount [ iMenu ]; static iDataItem [ MENU_ITEM_DATA ], iPosition ; iPosition = 0 ; static i ; for( i = iStart ; i < iEnd ; i ++){ ArrayGetArray ( g_MenuItems [ iMenu ], i , iDataItem ); set_dhudmessage ( iDataItem [ MENU_ITEM_RED ], iDataItem [ MENU_ITEM_GREEN ], iDataItem [ MENU_ITEM_BLUE ], iDataTitle [ MENU_POS_X ], iDataTitle [ MENU_POS_Y ]+ fItemPositionYDiff [ iPosition ], 0 , 1.0 , 0.1 , 0.1 , 1.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 + 1 , iDataItem [ MENU_ITEM_TEXT ]); iPosition ++; } static iPagesCount ; iPagesCount = ( g_iItemCount [ iMenu ] / MAX_ITEMS_PER_PAGE ); static szBuffer [ 40 ]; if( iDataTitle [ MENU_POS_X ] == 1.0 ) { formatex ( szBuffer , charsmax ( szBuffer ), "EXIT 0" ); if( iPage > 0 ) format ( szBuffer , charsmax ( szBuffer ), "%s^nBACK 8" , szBuffer ); if( iPage < iPagesCount ) format ( szBuffer , charsmax ( szBuffer ), "%s^nNEXT 9" , szBuffer ); } else { formatex ( szBuffer , charsmax ( szBuffer ), "0 EXIT" ); if( iPage > 0 ) format ( szBuffer , charsmax ( szBuffer ), "%s^n8 BACK" , szBuffer ); if( iPage < iPagesCount ) format ( szBuffer , charsmax ( szBuffer ), "%s^n9 NEXT" , szBuffer ); } set_dhudmessage ( 255 , 255 , 255 , iDataTitle [ MENU_POS_X ], iDataTitle [ MENU_POS_Y ] + fItemPositionYDiff [ iPosition - 1 ] + 0.1 , 0 , 1.0 , 0.1 , 0.1 , 1.0 ); show_dhudmessage ( iClient , szBuffer ); } public HudMenuEntity (const iEnt ){ if(! is_valid_ent ( iEnt )) return HAM_IGNORED ; for(new iClient = 1 ; iClient <= MAX_PLAYERS ; iClient ++){ if(! is_user_connected ( iClient ) || g_iMenuDisplay [ iClient ] == MENU_NONE ) continue; ShowHudMenu ( iClient , g_iMenuDisplay [ iClient ], g_iMenuPage [ iClient ]); } entity_set_float ( iEnt , EV_FL_nextthink , get_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.
Mensajes: 40
Temas: 14
Registro en: Jan 2020
Reputación:
0
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).
Mensajes: 3,020
Temas: 49
Registro en: Oct 2013
Reputación:
33
(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.
Mensajes: 7,178
Temas: 93
Registro en: Aug 2014
Reputación:
63
Mensajes: 3,238
Temas: 47
Registro en: Feb 2015
Reputación:
34
(16/09/2020, 12:04 AM) Hypnotize escribió: buen aporte
pd: obvio q gano yo entre esos maniseros
Mensajes: 7,178
Temas: 93
Registro en: Aug 2014
Reputación:
63
Mensajes: 466
Temas: 36
Registro en: Jan 2014
Reputación:
5
(15/09/2020, 08:08 PM) LeanPPP escribió: Tremendo el pihud menu , buen aporte
(12/03/2014, 08:11 PM) roccoxx escribió: jajajajajajajajajajajajajajajaajajajajajaajajajajajajajajajajajajajajajajajajajajajajajajajjajajjajajajajaja
todo eso elevado a la quinta potencia.