03/06/2020, 01:16 AM (Última modificación: 01/07/2020, 05:36 PM por Niper.-.. Edited 4 times in total.)
Buenas gente, les dejo el fix del Mix Maker v10.0 del "Keys and value can't be null"(creo que es). Bueno, esto es información totalmente educativa y sin fines malignos
Explicación
1- El jugador juan entra al servidor y selecciona el "Team Join Class Menú"(selección de models)
2- El jugador juan se queda en ese menú, por ende, jamás elige la clase de model que usará.
3- El administrador mengano esta listo para mandar el mix, por ende manda todos a spec
4- El jugador juan elige el model que antes jamás eligió, entonces el model queda en "" y hace crashear el servidor.
Bueno, ahora que sabemos como funciona, vamos a la solución.
En nuestro Mix Maker v10.0 buscaremos la siguiente función
Mix maker default
Código PHP:
public ExtraStuff_Handler(id, Menu, item) { if (item == MENU_EXIT) { if (is_user_connected(id)) OpenMixMenu(id)
return PLUGIN_HANDLED }
new iData[6] new iName[64] new Access new Callback
switch (Key) { case 1: { set_hudmessage(64, 64, 64, -1.0, 0.21, 1, 0.2, 5.0, 0.01, 0.1) show_hudmessage(0, "Todos para Spec")
for (new i = 1; i <= MaxPlayers; i++) { if (is_user_connected(i)) //Bien acá esta el error. Explicare cual es. { set_pev(i, pev_deadflag, DEAD_DEAD) cs_set_user_team(i, CS_TEAM_SPECTATOR)
BlockClCorpse[i] = true } }
if (is_user_connected(id)) Extras(id) }
case 2: { if (is_user_connected(id)) KickMenu(id) }
case 3: { if (is_user_connected(id)) BanMenu(id) }
} menu_destroy(Menu) return PLUGIN_HANDLED }
Bueno, como ven en el for que manda todos a spec, chequea is_user_connected pero jamás chequea si esta vivo el player.
Ahora el exploit como explique antes jamás elige el model por lo tanto jamás esta vivo!!.
Entonces, vuelve a mandarlo spec porque no chequea si esta vivo o no. Ahí esta la falla de programación. Si chequea que esta vivo, lo manda a spec, si no, va a seguir en el mismo menú de clases y cuando quiera conectarse, se conectara normal..
Mix maker fix
Código PHP:
public ExtraStuff_Handler(id,Menu,item) { if(item == MENU_EXIT) { if(is_user_connected(id)) OpenMixMenu(id)
return PLUGIN_HANDLED }
new iData[6] new iName[64] new Access new Callback
switch(Key) { case 1 : { set_hudmessage(64,64,64,-1.0,0.21,1,0.2,5.0,0.01,0.1) show_hudmessage(0,"Todos para Spec")
for(new i = 1;i <= MaxPlayers;i++) { if(is_user_alive(i)) //si esta conectado y vivo!!! lo manda a spec. { set_pev(i,pev_deadflag,DEAD_DEAD) cs_set_user_team(i,CS_TEAM_SPECTATOR)
BlockClCorpse[i] = true } }
if(is_user_connected(id)) Extras(id) }
case 2 : { if(is_user_connected(id)) KickMenu(id) }
case 3 : { if(is_user_connected(id)) BanMenu(id) }
} menu_destroy(Menu) return PLUGIN_HANDLED }
Bueno, esto fue lo que estuvimos probando, así que espero que lo metan en su mix maker e intenten hacer de esta información algo bueno para que dejen de matar el cs. Ahora sí, los amooo <3.
No hace falta usar is_user_connected & is_user_alive.
Con el chequeo de alive únicamente sirve
(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.
(03/06/2020, 08:10 AM)Neeeeeeeeeel.- escribió: Te indente el código con un beautifier online porque me hace doler los ojos verlo como estaba. No quedo perfecto pero mejor que antes está
(03/06/2020, 08:01 AM)RauliTop escribió: No hace falta usar is_user_connected & is_user_alive.
Con el chequeo de alive únicamente sirve
Cada vez que usas for con get_maxplayers(); es necesario si o si (al menos que quieras obtener el player) usar is_user_connected. Porque si no, si tengo 32 slots y solamente tengo 10 conectados, los otros 22 serian null. Y me devolveria todo "0". Para evitar eso, directamente obtengo los "10" conectados y listo
(03/06/2020, 08:10 AM)Neeeeeeeeeel.- escribió: Te indente el código con un beautifier online porque me hace doler los ojos verlo como estaba. No quedo perfecto pero mejor que antes está
No estaba así pero cuando edite el tema, se puso todo así
(03/06/2020, 04:17 PM)Niper.-. escribió: Cada vez que usas for con get_maxplayers(); es necesario si o si (al menos que quieras obtener el player) usar is_user_connected. Porque si no, si tengo 32 slots y solamente tengo 10 conectados, los otros 22 serian null. Y me devolveria todo "0". Para evitar eso, directamente obtengo los "10" conectados y listo
No estaba así pero cuando edite el tema, se puso todo así
si usas alive no es necesario el connected, haz la prueba
alive ya chequea si está conectado, por lo tanto, devuelve false en aquellos que no están conectados ni vivos
(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.
Eso no hace ninguna diferencia en tiempo de ejecución, la cantidad de lineas da igual lo importante son las instrucciones que se ejecutan en la CPU. Algo inteligente sería sacar is_user_connected, ya que esta implicito en is_user_alive
01/07/2020, 01:14 PM (Última modificación: 01/07/2020, 01:16 PM por Hinami. Edited 1 time in total.)
(01/07/2020, 10:49 AM)andres_1041 escribió: Así te ahorras una línea.
se la ahorra y el code es otro
en el anterior si estaba vivo lo mataba pero también lo mandaba a espectador si estaba vivo o muerto, en el tuyo debe estar vivo para que lo mate y pase a espectador.