Bueno, hace ya tiempo me pasó que utilizaba el plugin galileo (https://forums.alliedmods.net/showthread.php?t=77391) en un servidor y cuando llegaba la hora del vote, solo le salía el menú a algunos pocos.
Así que decidí investigarlo y me dí cuenta de que solo salía el menú a aquellos que antes del vote habían abierto algún menú cualquiera.
Lo primero fue ver en el plugin galileo porque pasaba esto y vi estas líneas:
que hace esto? simplemente get_user_menu devuelve el valor del menú que estás viendo, si no estás viendo ninguno es 0.
vale, como vemos en el chequeo, si te devuelve 0 o te devuelve el mismo menú del vote, se vuelve a mostrar.
entonces, lo que hice fue un simple plugin en el cual me decía si tenía un menú abierto o no utilizando get_user_menu. para mi sorpresa me encontré con que me decía que si, a pesar de que no tuviera ninguno abierto claro, y esto SOLO me pasaba después de ingresar al juego a través de un sistema de cuentas.
y también me di cuenta de que si yo abría un menu cualquiera, como el de admin, al cerrarlo me decía que no tenía ningún menú abierto.
viendo esto: http://www.amxmodx.org/funcwiki.php?go=func&id=1389
dije, mm.. asi que un VGUI menu tambien lo detecta get_user_menu, y efectivamente chequeando que el resultado de get_user_menu fuera negativo con el plugin que hice, me di cuenta que la culpa era de un VGUI menu que se me quedaba abierto después de "loguearme" en el servidor.
Pues vale, ya está, esto es culpa de forzar el jointeam de esta forma:
esa es la forma correcta de forzar jointeam sin que te aparezca ningún menú de elegir apariencia ni nada del cs default.
vale, pues el problema era ahí, utilizando esa forma, se quedaba el offset m_iVGUI activo, así que:
de esta forma, evitamos que el offset se quede activo y get_user_menu nos devuelva true cuando no estamos con ningún menú.
aclaro que las variables globales creadas son en plugin_init:
Esto fue todo, gracias
pd: la forma de "desactivar" ese offset la saqué del jailbreak de joropito
pd2: este error, obviamente, también se puede comprobar en otros plugins que utilicen get_user_menu
Así que decidí investigarlo y me dí cuenta de que solo salía el menú a aquellos que antes del vote habían abierto algún menú cualquiera.
Lo primero fue ver en el plugin galileo porque pasaba esto y vi estas líneas:
Código PHP:
get_user_menu(id, menuid, menukeys);
if (menuid == 0 || menuid == g_menuChooseMap)
{
show_menu(id, allKeys, menuDirty, max(1, g_voteDuration), MENU_CHOOSEMAP);
}
que hace esto? simplemente get_user_menu devuelve el valor del menú que estás viendo, si no estás viendo ninguno es 0.
vale, como vemos en el chequeo, si te devuelve 0 o te devuelve el mismo menú del vote, se vuelve a mostrar.
entonces, lo que hice fue un simple plugin en el cual me decía si tenía un menú abierto o no utilizando get_user_menu. para mi sorpresa me encontré con que me decía que si, a pesar de que no tuviera ninguno abierto claro, y esto SOLO me pasaba después de ingresar al juego a través de un sistema de cuentas.
y también me di cuenta de que si yo abría un menu cualquiera, como el de admin, al cerrarlo me decía que no tenía ningún menú abierto.
viendo esto: http://www.amxmodx.org/funcwiki.php?go=func&id=1389
dije, mm.. asi que un VGUI menu tambien lo detecta get_user_menu, y efectivamente chequeando que el resultado de get_user_menu fuera negativo con el plugin que hice, me di cuenta que la culpa era de un VGUI menu que se me quedaba abierto después de "loguearme" en el servidor.
Pues vale, ya está, esto es culpa de forzar el jointeam de esta forma:
Código PHP:
static teammsg_block, teammsg_block_vgui
teammsg_block = get_msg_block(g_msgShowMenu)
teammsg_block_vgui = get_msg_block(g_msgVGUIMenu)
set_msg_block(g_msgShowMenu, BLOCK_ONCE)
set_msg_block(g_msgVGUIMenu, BLOCK_ONCE)
engclient_cmd(id, "jointeam", "5")
engclient_cmd(id, "joinclass", "5")
set_msg_block(g_msgShowMenu, teammsg_block)
set_msg_block(g_msgVGUIMenu, teammsg_block_vgui)
esa es la forma correcta de forzar jointeam sin que te aparezca ningún menú de elegir apariencia ni nada del cs default.
vale, pues el problema era ahí, utilizando esa forma, se quedaba el offset m_iVGUI activo, así que:
Código PHP:
static teammsg_block, teammsg_block_vgui, restore, vgui
restore = get_pdata_int(id, 510) // m_iVGUI = 510
vgui = restore & (1<<0)
if (vgui) set_pdata_int(id, 510, restore & ~(1<<0))
teammsg_block = get_msg_block(g_msgShowMenu)
teammsg_block_vgui = get_msg_block(g_msgVGUIMenu)
set_msg_block(g_msgShowMenu, BLOCK_ONCE)
set_msg_block(g_msgVGUIMenu, BLOCK_ONCE)
engclient_cmd(id, "jointeam", "5")
engclient_cmd(id, "joinclass", "5")
set_msg_block(g_msgShowMenu, teammsg_block)
set_msg_block(g_msgVGUIMenu, teammsg_block_vgui)
if (vgui) set_pdata_int(id, 510, restore)
de esta forma, evitamos que el offset se quede activo y get_user_menu nos devuelva true cuando no estamos con ningún menú.
aclaro que las variables globales creadas son en plugin_init:
Código PHP:
g_msgShowMenu = get_user_msgid("ShowMenu")
g_msgVGUIMenu = get_user_msgid("VGUIMenu")
Esto fue todo, gracias
pd: la forma de "desactivar" ese offset la saqué del jailbreak de joropito
pd2: este error, obviamente, también se puede comprobar en otros plugins que utilicen get_user_menu