[TUT] Menu Jugadores Online
#1
Aqui un tutorial de un menu de los jugadores conectados, lo explique con mis palabras asi que si tienen una duda pregunten xD.
Le puse explicacion a todo como si fueran de kinder.
Código PHP:
#include <amxmodx> 

new g_maxplayers // En esta variable guardaremos el maximo numero de jugadores en el servidor (max slots)
public plugin_init() { // Funcion que es llamada al iniciar el plugin, ya sea en un cambio de mapa o reinicio del servidor
    
register_plugin("Menu Players Online""0.1""Metrikcz"// registro del plugin
    // 1 parametro: Definimos el nombre del plugin y como es un string se pone entre comillas 
    // 2 parametro: Definimos la version del plugin ------------------------
    // 3 parametro: Definimos el author del plugin -------------------------
    
register_clcmd("say /mpl""cmdMpl"// registramos el comando
    
g_maxplayers get_maxplayers() // Le damos el valor a la variable ya que get_maxplayers retorna el maximo numero de jugadores
}
public 
cmdMpl(id) {
    
// Funcion que es llamada cuando un jugador escriba /mpl
    // primer y unico parametro: "id", que es la ID del usuario que escribio
    // la ID de los usuarios es un numero entre el 1 y el 32, el cual se puede saber poniendo status en consola
    
new menu //Variable donde guardaremos el "ID" del menu que se usara para agregarle cosas como items o props
    
menu menu_create("Jugadores Online""handler_menuMpl")
    
// 1 parametro definimos el titulo del menu
    // 2 parametro definimos el nombre de la funcion del handler que se llamara cuando usemos el menu
    
    // porque "menu = ..." como ya dije en menu guardaremos la ID del mismo, y menu_create retorna su "ID" y le damos el valor haciendo esto: "menu = "
    
    
new name[32], IDS[12// Creamos las variables donde guardaremos el nombre de un usuario y su ID and USERID pero en un solo string
    // -------- Este pedaso se "llamara|realizara" el numero de veces que sea g_maxplayers ya sea 32 o los slots del servidor --------
    
for(new 1<= g_maxplayersi++) { // Hacemos un bucle o loop, lo que hacemos es mientras "i" sea menor o igual a maxplayers seguira el bucle
        // Ahora vien pasaremos por los 32 usuarios ya que el id del usuario es un numero entre el 1 y 32
        
if(is_user_connected(i)) { // Vamos a checar si esta conectado un usuario con esta ID osea i
            // bien la id "i" que va en el loop esta conectada 
            
get_user_name(inamecharsmax(name)) // Guardamos el nombre del usuario que tenga como su ID: "i donde vaya el bucle"
            
formatex(IDScharsmax(IDS), "%d %d"iget_user_userid(i)) // Guardamos el id and userid del usuario para despues usarlo en el handler e identificar al player
            
menu_additem(menunameIDS// Agregamos el item
            // 1 parametro: la ID del menu donde se agregara el item, por eso se tenia que guardar la ID del menu
            // 2 parametro: el nombre del item el cual es el nombre del usuario
            // 3 parametro: En este guardamos el ID y userid del usuario para despues validarlo y obtener sus ids en el handler
        
}
    
    }
    
// -------- Este pedaso se "llamara|realizara" el numero de veces que sea g_maxplayers ya sea 32 o los slots del servidor --------
    
menu_display(idmenu0// mostramos el menu
    // 1 parametro: la ID del usuario que vera el menu osea la ID del que escribio /mpl
    // 2 parametro: La ID del menu
    // 3 parametro: la pagina en la que se abrira, cada 7 items es 1 pagina, si hay 13 players conectados habra 2 paginas en el menu
}
public 
handler_menuMpl(idmenuitem) { // Funcion que es llamada cuando se usa el menu, se preciona algun item o lo cierras el menu
    
if(item == MENU_EXIT) { // Primero siempre tendremos que checar si item es menu_exit lo cual nos dice que preciono 0 y cerro el menu
        // si item si es menu_exit osea que lo cerro
        
menu_destroy(menu// Destruimos el menu
        
return PLUGIN_HANDLED// Le detemos la funcion para que desde aqui hasta abajo ya no lea nada, que aqui se quede
    
}
    
// Ahora lo que sigue sera obtener el tercer parametro de menu_additem, osea la ID and userid del usuario 
    // usaremos la native menu_item_getinfo lo cual nos data todos los parametros asi que tendremos que crear variables que nos dara sus valores
    
new lolbuffer[12], playeriduserid // Aqui los guardaremos
    
menu_item_getinfo(menuitemlolbuffercharsmax(buffer), __lol)
    
// 1 parametro ID del menu que la tenemos en el handler
    // 2 parametro el item osea lo que presiono si es 3 sera el tercer item que se agrego
    // 3 y 4 parametro aqui nos estara dando el tercer parametro de menu_additem y ahi en buffer ya tendremos la ID and userid del usuario que selecciono el user que abrio el menu
    // los demas no importan ya que tenemos lo que queremos
    
    
new szid[3], szuserid[9// Variables donde guardaremos las IDS que se encuentran en buffer
    // separamos las ids, la id y la userid
    
parse(bufferszidcharsmax(szid), szuseridcharsmax(szuserid)) // separamos los datos
    
playerid str_to_num(szid// Ahora en una variable integer guardaremos la id del usuario, para ello en la variable buffer donde la tenemos la pasamos de string a numero porque las ids de los players es un numero (1-32)
    
userid str_to_num(szuserid// Aqui la userid del usuario que se selecciono
    // pero porque usamos la userid? es facil se explicara mas adelante
    
    // Listo ya tenemos la id del usuario que selecciono ahora lo demas es muy facil
    // Vamos a checar que esta conectado ¿porque si ya lo hicimos cuando creamos el menu?
    // es facil al abrir el menu esta conectado, el que lo abrio puede permanecer con el menu minutos abiertos con el y cuando seleccione a un usuario este ya se pudo haber desconectado
    
if(!is_user_connected(playerid))  { // si no esta conectado ...
        
client_print(idprint_chat"Usuario seleccionado con la ID: %d se ha desconectado."playerid)
        return 
PLUGIN_HANDLED// le detenemos la funcion para que no siga leyendo, que desde aqui hasta abajo ya no lea nada que aqui se acabe
    
}
    
// Aqui es donde usaremos la userid para validar el player, como dije antes un usuario se puede desconectar cuando lo haigan elegido, pero tambien pasa de que se desconecta y se mete otro usuario al servidor y se le asigna ese id, osea que el usuario cambio su id sera igual pero no su userid asi que lo comprobaremos ahora
    
if(userid != get_user_userid(playerid)) { // si la userid no es la del player ...
        
client_print(idprint_chat"Usuario seleccionado no es el que usted eligio.")
    return 
PLUGIN_HANDLED// le detenemos la funcion para que no siga leyendo, que desde aqui hasta abajo ya no lea nada que aqui se acabe
    
}
    new 
name[32// Aqui guardaremos el nombre del user seleccionado
    
get_user_name(playeridnamecharsmax(name))  // Obtenemos su nombre con esta native y lo guardamos en la variable "name"
    
    // Mandamos un mensaje del usuario que selecciono y listo si ustedes le haran otra cosa ya es cosa de ustedes ya tienen su ID para manipularle 
    
client_print(idprint_chat"Has seleccionado a: %s su id es: %d y su userid es: %d"nameplayeriduserid)
    return 
PLUGIN_HANDLED// por "leyes" de pawn si se returnea en la funcion al ultimo tambien tiene que haber un return

Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder
#2
Buen aporte! Como sugerencia, podrias utilizar el userid en lugar de id en el string de info en el menú, es más seguro porque es único. Tambien puedes usar get_players(), es más eficiente porque sólo llamas 1 vez a la native y no 32 veces, o el método de checkear un jugador conectado por macro (bitsums) es aun más eficiente.
Responder
#3
Oc Gracias
no entendi lo primero que quisiste decir
Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder
#4
Código PHP:
num_to_str(get_user_userid(i), iIDcharsmax(iID)) 
Y aumentas el tamaño del vector a 6 o 7. Esto sirve porque si abres el menú, y antes de que elijas a un jugador este se desconecta y entra otro y recibe el mismo ID, tomará la acción aunque sea otro player. Esto no sucede con el UserID, por eso es más seguro.
Responder
#5
o si ya te entendi bueno yo le llamaba de otra forma xD

Entonces ocuparia una native para pasar de userid a id, existe?, porque la ocuparia en el handler
Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder
#6
Así Guiño
Código PHP:
new playerid find_player("k"str_to_num(buffer)); // Flag "k" es por userid.
    
if (playerid)
{
    
// Es el mismo jugador que elegimos en el menu y esta conectado!
}
else
{
    
// Ya no está D:

Responder
#7
Sale muy bien despues lo agrego gracias

Me imagino que find player loopea para encontrar la id de ese userid entonces estoy haciendo mas procesos, entonces la pregunta es
¿ tanto pedo solo por si selecciona un usuario y ese se desconecta pero lo remplaza otro ademas de que es muy poco probable, vale la pena ?
Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder
#8
(05/06/2014, 12:09 AM)Metrikcz escribió: ¿ tanto pedo solo por si selecciona un usuario y ese se desconecta pero lo remplaza otro ademas de que es muy poco probable, vale la pena ?
Imaginate un menu de ban y que al usuario al que le van a dar ban se desconecta,al mismo tiempo entra uno que no tiene nada que ver y le dan ban,luego ese usuario se conecta al foro y le hace una denuncia al admin que le dio ban (?

http://amxmodx-es.com/Thread-sXe-Free-Screen-Menu
mira el code
esa es otra forma de validar al player
Responder
#9
(05/06/2014, 12:54 AM)Destro escribió:
(05/06/2014, 12:09 AM)Metrikcz escribió: ¿ tanto pedo solo por si selecciona un usuario y ese se desconecta pero lo remplaza otro ademas de que es muy poco probable, vale la pena ?
Imaginate un menu de ban y que al usuario al que le van a dar ban se desconecta,al mismo tiempo entra uno que no tiene nada que ver y le dan ban,luego ese usuario se conecta al foro y le hace una denuncia al admin que le dio ban (?

http://amxmodx-es.com/Thread-sXe-Free-Screen-Menu
mira el code
esa es otra forma de validar al player

y eso fue exactamente lo que pense y con ese ejemplo de ban xd se me olvido aclarar que depende de la situacion.
Igualmente gracias
Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder
#10
Bastante bueno...
[Imagen: 76561197999970868.png]
Responder
#11
Se ve bueno una cosa quizas sea conveniente guardar el nombre cada vez q entra alguien al sv y cuando se lo cambia para evitar tantos llamados al get_user_name
[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#12
(05/06/2014, 02:38 PM)LA BANDA escribió: Bastante bueno...

Gracias
(05/06/2014, 03:05 PM)mongito100 escribió: Se ve bueno una cosa quizas sea conveniente guardar el nombre cada vez q entra alguien al sv y cuando se lo cambia para evitar tantos llamados al get_user_name

Este es un ejemplo de menu para los players online no algo que se vaya a usar. Gracias igualmente
Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)