Forma correcta de forzar jointeam + Galileo Fix
#1
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:
Código PHP:
get_user_menu(idmenuidmenukeys);
if (
menuid == || menuid == g_menuChooseMap)
{
    
show_menu(idallKeysmenuDirtymax(1g_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_blockteammsg_block_vgui
teammsg_block 
get_msg_block(g_msgShowMenu)
teammsg_block_vgui get_msg_block(g_msgVGUIMenu)
set_msg_block(g_msgShowMenuBLOCK_ONCE)
set_msg_block(g_msgVGUIMenuBLOCK_ONCE)
engclient_cmd(id"jointeam""5")
engclient_cmd(id"joinclass""5")
set_msg_block(g_msgShowMenuteammsg_block)
set_msg_block(g_msgVGUIMenuteammsg_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_blockteammsg_block_vguirestorevgui
restore 
get_pdata_int(id510// m_iVGUI = 510
vgui restore & (1<<0)
if (
vguiset_pdata_int(id510restore & ~(1<<0))
teammsg_block get_msg_block(g_msgShowMenu)
teammsg_block_vgui get_msg_block(g_msgVGUIMenu)
set_msg_block(g_msgShowMenuBLOCK_ONCE)
set_msg_block(g_msgVGUIMenuBLOCK_ONCE)
engclient_cmd(id"jointeam""5")
engclient_cmd(id"joinclass""5")
set_msg_block(g_msgShowMenuteammsg_block)
set_msg_block(g_msgVGUIMenuteammsg_block_vgui)
if (
vguiset_pdata_int(id510restore

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 Whatever

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
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
1
Responder


Mensajes en este tema
Forma correcta de forzar jointeam + Galileo Fix - por RauliTop - 28/03/2014, 11:36 AM

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)