Veteran Member
Join Date: Jul 2006
Location: France (95)
12-30-2013
, 01:26
Re: Call public function by string
#5
Cache the function index and use callfunc_begin_i, it should slightly faster.
I'm using this native which allow to add any function that doesn't take parameters from a plugin :
PHP Code:
native kz_add_menuitem ( itemName [ 64 ], const szCmdCallBack [], reshow = 0 );
And menu is here :
PHP Code:
#include < amxmodx >
#include < chatcolor >
#include < KzLeod/kz >
#pragma semicolon 1
#define PLUGIN "Kz User Menu"
#define VERSION "0.0.1"
const Invalid_NewMenu = - 1 ;
const Invalid_FuncId = - 1 ;
new g_iKzMainMenu = Invalid_NewMenu ;
enum mMenuDatas
{
m_iPlugin ,
m_iFunction ,
m_bReshow
}
new Array: g_aMenu = Invalid_Array ;
public plugin_init ()
{
register_plugin ( PLUGIN , VERSION , "ConnorMcLeod" );
}
public client_putinserver ( id )
{
if( g_iKzMainMenu != Invalid_NewMenu )
{
remove_task ( id );
if( ! is_user_bot ( id ) && ! is_user_hltv ( id ) )
{
set_task ( random_float ( 15.0 , 25.0 ), "Task_CmdInfo" , id );
}
}
}
public Task_CmdInfo ( id )
{
if( is_user_connected ( id ) )
{
client_print_color ( id , Grey , "^4[KZ] ^1Type ^3/menu ^1or ^3/kz ^1in order to open main kz menu." );
}
}
CheckMenuExists ()
{
if( g_iKzMainMenu == Invalid_NewMenu )
{
g_iKzMainMenu = menu_create ( "\yKz Menu\R \dCommand" , "Handle_KzMenu" );
menu_setprop ( g_iKzMainMenu , MPROP_NUMBER_COLOR , "\y" );
register_saycmd ( "menu" , "ClCmd_Menu" );
register_saycmd ( "kz" , "ClCmd_Menu" );
}
if( g_aMenu == Invalid_Array )
{
g_aMenu = ArrayCreate ( mMenuDatas );
}
}
public plugin_natives ()
{
register_library ( "kzmenu" );
register_native ( "kz_add_menuitem" , "native_add_menuitem" );
}
// kz_add_menuitem(itemName[64], const szCmdCallBack[])
public native_add_menuitem ( plugin , parms )
{
new szTemp [ 64 ];
get_string ( 2 , szTemp , charsmax ( szTemp ));
new func = get_func_id ( szTemp , plugin );
if( func != Invalid_FuncId )
{
CheckMenuExists ();
new mMenuItem [ mMenuDatas ];
mMenuItem [ m_iFunction ] = func ;
mMenuItem [ m_iPlugin ] = plugin ;
mMenuItem [ m_bReshow ] = get_param ( 3 );
ArrayPushArray ( g_aMenu , mMenuItem );
get_string ( 1 , szTemp , charsmax ( szTemp ));
menu_additem ( g_iKzMainMenu , szTemp );
return 1 ;
}
return 0 ;
}
public ClCmd_Menu ( id )
{
MenuDisplay ( id , g_iKzMainMenu );
}
public Handle_KzMenu ( id , menu , item )
{
if( item >= 0 )
{
new mMenuItem [ mMenuDatas ];
ArrayGetArray ( g_aMenu , item , mMenuItem );
callfunc_begin_i ( mMenuItem [ m_iFunction ], mMenuItem [ m_iPlugin ]);
callfunc_push_int ( id );
callfunc_end ();
if( mMenuItem [ m_bReshow ] )
{
MenuDisplay ( id , menu , GetUserMenuPage ( id ));
}
}
}
__________________