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
#2
o.O interesante
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
#3
Es algo parecido a cuando abres un menu que no se puede cerrar con MEXIT_NEVER y escribes algun comando en say para abrir otro menu este no se abre...


PD: Buen aporte
Responder
#4
Gracias por tu tutorial!
Responder
#5
Tal vez parezca una pregunta tonta pero, porqe usas 4 var estáticas? Whatever
Whatdone
Responder
#6
(30/09/2014, 07:59 PM)NikKOo31 escribió: Tal vez parezca una pregunta tonta pero, porqe usas 4 var estáticas? Whatever

te refieres a por qué hay 4 o a por qué son estáticas?
(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.
Responder
#7
(01/10/2014, 03:24 AM)RauliTop escribió: te refieres a por qué hay 4 o a por qué son estáticas?

Lo segundo ._.
Es necesario qe sean estáticas? ^^
Whatdone
Responder
#8
GRABO RAULITOP TE VOTO GRACIAS RAUL ._.
Crab Crab Crab Crab
Responder
#9
(01/10/2014, 12:13 PM)NikKOo31 escribió:
(01/10/2014, 03:24 AM)RauliTop escribió: te refieres a por qué hay 4 o a por qué son estáticas?

Lo segundo ._.
Es necesario qe sean estáticas? ^^

no, pero al ser una función que se va a llamar cuando alguien se loguea (es decir, bastantes veces), pues es conveniente que sean estáticas ya que son más rápidas
(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.
Responder
#10
Ya que estamos otra pregunta Whatever

Que estoy haciendo mal aqui?
Código PHP:
public ForzarJointeam(params[], id)
{
    
server_print("forzarjointeam t:%d"params[0])
    static 
teammsg_blockteammsg_block_vguirestorevguiszteam[3], szclass[3], team
    team 
params[0]
    
restore get_pdata_int(id510// m_iVGUI = 510
    
vgui restore & (1<<0)
    if(
vgui)
    {
        
set_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)
    
szteam[0] = team '0'
    
szteam[1] = 0
    szclass
[0] = '5'
    
szclass[1] = 0
    engclient_cmd
(id"jointeam"szteam)
    if(
team != 6)
    {
        
engclient_cmd(id"joinclass"szclass)
    }
    
set_msg_block(g_msgShowMenuteammsg_block)
    
set_msg_block(g_msgVGUIMenuteammsg_block_vgui)
    if(
vgui)
    {
        
set_pdata_int(id510restore
    }


La idea principal es enviar a spec si la ronda ya esta empezada. Me bloquea el menu y en la consola sale:
Cita:forzarjointeam t:6

Pero me quedo en unassigned. Ya probe con y sin task y nada Poker face
Whatdone
Responder
#11
Justo hoy me paso una situación asi , no le di mucha bola . Lo saque para depues testear
Interesante voy a ver que onda
[Imagen: tumblr_mt8w6d7yz11rn3500o1_400.gif]
Responder
#12
(01/10/2014, 05:47 PM)NikKOo31 escribió: La idea principal es enviar a spec si la ronda ya esta empezada. Me bloquea el menu y en la consola sale:
Cita:forzarjointeam t:6

Pero me quedo en unassigned. Ya probe con y sin task y nada Poker face

cuando llamas a esa función?

estás seguro que sigues siendo unassigned, hiciste un print o algo?

edit: acabo de probar el código de tu forma, igual las variables y todo y sí que me funciona.
(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.
Responder
#13
Estoy seguro que me deja unassigned, no puedo espectear a nadie, solo me deja mirar las "cámaras del mapa" y no puedo moverme ni abrir el menu de spec con el ctrl. Tmb me fije desde el team menu, y si me paso manualmente quedo bugueado y no tengo crosshair ._."

Código PHP:
    register_message(g_msgShowMenu get_user_msgid("ShowMenu"),"MessageShowMenu")
    
register_message(g_msgVGUIMenu get_user_msgid("VGUIMenu"), "MessageVGUIMenu")

//...
public MessageVGUIMenu(msgIddestid)
{
    if(
is_user_connected(id) && get_msg_arg_int(VGUIMENU_ARG_MENUID) == VGUIMENU_MENUID_TEAMSELECT && round_started)
    {
        
//server_print("message vgui menu handled")
        
new params[1]
        
params[0] = 6
        set_task
(0.1"ForzarJointeam"idparamssizeof params)
        return 
PLUGIN_HANDLED
    
}
    
//server_print("message vgui menu continue")
    
return PLUGIN_CONTINUE
}

public 
MessageShowMenu(msgIddestid)
{
    new 
menuCode[32]
    
get_msg_arg_string(4menuCodecharsmax(menuCode))

    if(
containi(menuCode"Team_Select") > && round_started)
    {
        
//server_print("message show menu handled")
        
new params[1]
        
params[0] = 6
        set_task
(0.1"ForzarJointeam"idparamssizeof params)
        return 
PLUGIN_HANDLED
    
}
    
//server_print("message show menu continue")
    
return PLUGIN_CONTINUE


Me siento idiota Genius
Perdón por joder tanto Crab
Whatdone
Responder
#14
Tenes puesto allow_spectators 1 ?
Responder
#15
(02/10/2014, 02:13 PM)Destro escribió: Tenes puesto allow_spectators 1 ?

Sipi Nothingdohere
Whatdone
Responder
#16
Que raro o.O

Ayer cuando lo probé y me paso lo mismo pero era porque tenia el hlds default con allow_spectators en 0.
Responder
#17
(02/10/2014, 10:48 PM)Destro escribió: Que raro o.O

Ayer cuando lo probé y me paso lo mismo pero era porque tenia el hlds default con allow_spectators en 0.

Lo acabo de probar en un server hosteado y anda Poker face
Será problema de mi dedicado Whatdone

Sorry por todo el spameo D:
Whatdone
Responder
#18
Para prevenir "Only 1 team change is allowed."

Código PHP:
const m_iVGUI 510
const m_bools125 125
const m_bHasChangeTeamThisRound = (1<<8)

/*
team:
 -0: AUTO
 -1: TT
 -2: CT
 -3: SPECT
free_changeteam:
  true: habilita el cambio de team en esa ronda
  false: (Only 1 team change is allowed.) 
*/
stock force_jointeam(idteamfree_changeteam)
{
    new 
param[2];param[0] = team;param[1] = free_changeteam;
    
set_task(0.3"task_jointeam"idparam2)
}

public 
task_jointeam(param[], id)
{
    static 
restorebool25vgui
    
static const str_teams[][] = { "5""1""2""6" }
    
    
restore get_pdata_int(idm_iVGUI)
    
vgui restore & (1<<0)
    if(
vguiset_pdata_int(idm_iVGUIrestore & ~(1<<0))

    
bool25 get_pdata_int(idm_bools125)

    if(
bool25 m_bHasChangeTeamThisRound)
    {
        
bool25 &= ~m_bHasChangeTeamThisRound
        set_pdata_int
(idm_bools125bool25)
    }
    
    
// No obtengo el bloqueo actual porque no hay ninguna razon para que un plugin bloquee estos mensajes globalmente. 
    
set_msg_block(g_msgShowMenuBLOCK_ONCE)
    
set_msg_block(g_msgVGUIMenuBLOCK_ONCE)

    
engclient_cmd(id"jointeam"str_teams[param[0]])
    if(
param[0] != 3engclient_cmd(id"joinclass""5")

    
set_msg_block(g_msgVGUIMenuBLOCK_NOT)
    
set_msg_block(g_msgShowMenuBLOCK_NOT)
    
    if(
vguiset_pdata_int(idm_iVGUIrestore)
    if(
param[1]) set_pdata_int(idm_bools125bool25)

Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)