21/07/2014, 10:49 AM (Última modificación: 10/02/2017, 08:58 AM por cLAANS.)
Sistema de mensajería privada
. Descripción
Con este sencillo plugin podremos comunicarnos con alguna persona de forma privada
. Comando(s)
Escribiendo /mp o /mensajeria en say & say team se abrirá un menú, una vez abierto se podrá seleccionar un jugador para escribirle un mensaje a través de un messagemode
. Cvar(s)
1) amx_cvar_mensajeria < 1 (Default)|0 >
. Changelog
Código:
versión 1.0
- Publicación del plugin
versión 1.1
- Optimización: Obtención del nombre de los jugadores
- Optimización: Cambio de g_data[ 33 ] -> g_data[ 33 char ]
versión 1.2
- Agregado: Sistema para bloquear players
versión 1.3
- Agregado: Anti spam (Los números, ".com", ".ar", "www", serán representados por '*')
Agregamos o borramos lo que queremos que se represente con un '*'
. Créditos
Código:
- Gonza.-* (Idea sobre no permitir que X player te envié mensajes privados )
- Neeeeeeeeel.- (Observación de la variable g_data)
- [R]ak (Stock de MensajeValido)
g_data podría ser char ya que se usa para el listado de jugadores, que no pueden superar los 32.
Ya que hacés un cache para ver quien está conectado y quién no, podrías hacer un caché con la lista de jugadores en vez de estar llamando todo el tiempo a get_players.
(21/07/2014, 11:12 AM)Neeeeeeeeeel.- escribió: g_data podría ser char ya que se usa para el listado de jugadores, que no pueden superar los 32.
Ya que hacés un cache para ver quien está conectado y quién no, podrías hacer un caché con la lista de jugadores en vez de estar llamando todo el tiempo a get_players.
No entendí muy bien lo segundo, pero la hice de esta nueva forma, creo que es mejor, no llamo a get_players cada vez que se abre el menu y tampoco a get_user_name.
21/07/2014, 01:20 PM (Última modificación: 21/07/2014, 01:22 PM por Neeeeeeeeeel.-.)
(21/07/2014, 01:14 PM)cLAANS escribió: No entendí muy bien lo segundo, pero la hice de esta nueva forma, creo que es mejor, no llamo a get_players cada vez que se abre el menu y tampoco a get_user_name.
(21/07/2014, 01:14 PM)cLAANS escribió: No entendí muy bien lo segundo, pero la hice de esta nueva forma, creo que es mejor, no llamo a get_players cada vez que se abre el menu y tampoco a get_user_name.
if( !equal( g_nombre[ id ], iName ) ) copy( g_nombre[ id ], charsmax( g_nombre[ ] ), iName );
return PLUGIN_CONTINUE; }
(21/07/2014, 01:33 PM)Xplod escribió: Gracias por el aporte me sirvio mucho, estaria bueno que tenga una bandeja de entrar donde le podrias dejar los mp a los que no esten conectados.
Pls, veo que hago >.<, nunca es tarde para innovar
21/07/2014, 08:07 PM (Última modificación: 21/07/2014, 08:08 PM por Neeeeeeeeeel.-.)
(21/07/2014, 07:59 PM)Mario AR. escribió: Una vez lo hice; pero se veia más desordenado y requería de una matriz global; peor que llamar a una native a mi parecer (O hay otra forma O.O?).
Como está usando un loop de 1 a la cantidad máxima de jugadores, el parámetro "item" incrementado en 1 es el ID del jugador.
(21/07/2014, 07:59 PM)Mario AR. escribió:
(21/07/2014, 07:55 PM)Neeeeeeeeeel.- escribió: Con qué necesidad creás una referencia estática local que usas solo una vez?
(21/07/2014, 07:59 PM)Mario AR. escribió: Una vez lo hice; pero se veia más desordenado y requería de una matriz global; peor que llamar a una native a mi parecer (O hay otra forma O.O?).
Como está usando un loop de 1 a la cantidad máxima de jugadores, el parámetro "item" incrementado en 1 es el ID del jugador.
Eso se cumple si los IDs de los jugadores conectados van desde el 1 y son consecutivos. Imagina que estén conectados los IDs 1, 3 y 5. El ID 1 abre el menú, el key 2 sería para el index 5 pero item+1 sería 2.
Con este sencillo plugin podremos comunicarnos con alguna persona de forma privada
. Comando(s)
Escribiendo /mp o /mensajeria en say & say team se abrirá un menú, una vez abierto se podrá seleccionar un jugador para escribirle un mensaje a través de un messagemode
. Cvar(s)
1) amx_cvar_mensajeria < 1 (Default)|0 >
. Changelog
Código:
versión 1.0
- Publicación del plugin
versión 1.1
- Optimización de la obtención del nombre de los jugadores
- Optimización g_data[ 33 ] -> g_data[ 33 char ]
. Imágenes
Saludos,
cLAANS.-
Muy bien plugin y a mi parecer muy Original .. Pero Solo deberias dejar el "fixeado" no 2 versiones .. es una recomendacion..
Yo hice uno parecido hace un monton... creo que la unica diferencia es que podes bloquear a un jugador para que no te mande mas MP... y no es con menu, aca lo dejo por si sirve de algo... Los names con mas de 12 caracteres no estan permitidos
if (szArgs[0] != '"') { ColorChat(id, GREEN, "%s^x01 Formato: .msg^x04 ^"^x01..Aca el nombre..^x04^"^x03 Mensaje...", szPrefix) return PLUGIN_HANDLED }
static szName[33]
if (!parse(szArgs, szName, charsmax(szName))) return PLUGIN_CONTINUE
static i for (i = 1; i <= g_MaxPlayers; i++) { if (!is_user_connected(i)) continue
if (containi(gName[i], szName) != -1) { if (gBlock[i] & id) { ColorChat(id, GREEN, "%s^x01 El usuario^x04 %s^x01 Te tiene bloqueado", szPrefix, gName[i]) return PLUGIN_HANDLED } static Color:COLOR; COLOR = get_user_team(id) == 1 ? RED : BLUE remove_quotes(szArgs); trim(szArgs) ColorChat(i, COLOR, "^x04%s^x03 %s^x01: %s", szPrefix, gName[id], szArgs[strlen(szName) + 2]) ColorChat(id, COLOR, "^x04%s^x03 %s -> %s^x01: %s", szPrefix, gName[id], gName[i], szArgs[strlen(szName) + 2]) gLast[i] = id gLastName[i] = gName[id] return PLUGIN_HANDLED } } } else if (equali(szArgs, ".rm", 3) || equali(szArgs, "/rm", 3)) { if (!is_user_connected(gLast[id]) || !equali(gLastName[id], gName[gLast[id]])) { ColorChat(id, GREEN, "%s^x01 El jugador al que intentas responder se desconecto o cambio de nombre", szPrefix) return PLUGIN_HANDLED }
if (gBlock[gLast[id]] & id) { ColorChat(id, GREEN, "%s^x01 El usuario^x04 %s^x01 Te tiene bloqueado", szPrefix, gName[gLast[id]]) return PLUGIN_HANDLED }
if (equal(gName[id], szName)) return FMRES_IGNORED else if (strlen(szName) > 12) { ColorChat(id, RED, "^x04%s^x01 Tu nombre no puede contener mas de^x03 12^x01 caracteres.", szPrefix) engfunc(EngFunc_SetClientKeyValue, id, buffer, "name", gName[id]) client_cmd(id, "name %s", gName[id]) return FMRES_SUPERCEDE } gName[id] = szName return FMRES_IGNORED }
public client_disconnect(id) { static i for (i = 1; i <= g_MaxPlayers; i++) { if (gBlock[i] & id) gBlock[i] |= ~id } }
public client_putinserver(id) { get_user_name(id, gName[id], charsmax(gName[]))
if (strlen(gName[id]) > 12) { client_print(id, print_console, "Tu nombre contiene mas de 12 caracteres, debe contener 12 o menos.") server_cmd("kick #%d ^"Tu nombre contiene mas de 12 caracteres, debe contener 12 o menos.^"", get_user_userid(id)) return }
gLast[id] = 0 gLastName[id] = "" }
ColorChat(id, GREEN, "%s^x01 Formato: .msg^x04 ^"^x01..Aca el nombre..^x04^"^x03 Mensaje...", szPrefix)
23/07/2014, 03:22 AM (Última modificación: 23/07/2014, 03:25 AM por Mía.)
Creo que la versión de cLAANS con la opción de bloquear a un jugador sería excelente! (Por UserID para que se liberen del bloqueo con un reconnect).
EDIT: Eso se puede hacer con bits ^^ no hace falta crear una matriz. Sólo edita el menú de jugadores, pones un if en el título para cambiarlo según sea el menú de bloquear jugadores o el de elegir un jugador para enviar un mensaje. Y le agregas un formatex antes del menu_additem, para poner [Bloqueado] en el menú para bloquear y [No Disponible] para los que te tienen bloqueado en el menú para elegir el receptor.
Te puedes guiar de mi plugin del sXe Admin Menu o el desaprobado Marica + Mute.