Contenido generado con IA — puede contener errores.

Interfaces

Reglas de chat

Quién lee el chat de quién: una regla por plugin, y la audiencia a la que entrega el servidor.

Un plugin registra una regla y la librería quita de cada mensaje a los receptores que esa regla rechaza, antes de que el servidor lo entregue — un evento cuyos jugadores solo hablan entre ellos, una arena cuyo chat no sale de ella, un espectador que lee una partida sin que le lean a él.

Chats.rule(this, (listener, speaker) -> {
    var theirs = events.eventOf(listener);
    var his = events.eventOf(speaker);
    if (theirs.isEmpty() && his.isEmpty()) return true;   // los dos fuera
    if (theirs.isEmpty() || his.isEmpty()) return false;  // nunca cruza
    return theirs.get() == his.get();
});
MétodoQué hace
Chats.rule(plugin, rule)Registra la regla de este plugin, reemplazando la anterior.
Chats.clear(plugin)La quita.
Chats.canHear(listener, speaker)La respuesta en la que coinciden todas las reglas, para texto que un plugin entrega por su cuenta.

ChatRule es una interfaz funcional: boolean canHear(Player listener, Player speaker).

Cómo se comporta

No se cancela ni se reenvía nadaEl mensaje conserva el formato, el hover y los clics que le dio su plugin de chat; solo la audiencia es menor. La consola conserva la línea completa.
Todas las reglas tienen que estar de acuerdoSe combinan con AND: un mensaje llega a un jugador solo si ningún plugin se opone. Una regla por plugin, que se cae al desactivarlo.
La pregunta es asimétricacanHear(a, b) y canHear(b, a) son respuestas distintas — que es lo que permite que un espectador lea una partida sin que le lean.
Quien habla siempre se leeA las reglas ni se les pregunta por eso.
No se recuerda nada entre mensajesLa regla se pregunta al entregar el mensaje, así que quien entra a mitad de frase ya está dentro para la línea siguiente.
Una regla rota pierde su voto, no el chatUna regla que lanza excepción se ignora en ese mensaje y se avisa una vez, por nombre de plugin.
Sin reglas no cuesta nadaLos dos handlers leen un mapa y vuelven.

Qué necesita, y qué no cubre

Un plugin de chat que deje entregar el mensaje al servidor: el chat propio de Paper y cualquier plugin de chat basado en renderer lo hacen. Se manejan los dos eventos, el moderno AsyncChatEvent y el antiguo AsyncPlayerChatEvent.

Un plugin que en vez de eso cancela el evento y manda cada línea por su cuenta se ha quedado con la entrega; esas copias quedan fuera de alcance, y una audiencia entregada como inmutable se avisa una vez y se deja en paz. Los dos casos fallan abiertos: el chat sigue funcionando y el aislamiento no se aplica.

Chat, y solo chat. Los mensajes de entrada y salida, los de muerte, los broadcasts y los privados no son eventos de chat y no se tocan — tampoco un mensaje que llega de otro servidor por Redis, que aquí nunca fue un evento de chat. Ése se filtra donde se entrega, con Chats.canHear.

Las reglas se preguntan en el hilo del chat

No en el principal. Una regla tiene que ser barata y leer solo estado compartido: sin tocar el mundo, sin tocar entidades, sin bloquear. Registrar y quitar una regla es seguro desde cualquier hilo.

¿Falta algo en esta página? Dínoslo en Discord