Saltar al contenido principal

Ghost

Muestra a jugadores de otros servidores de tu red como fantasmas en el cliente, con un interruptor por jugador.

Privadasv0.1Social
RequiereTypeWriter0.9.0-beta-177 (BTC build)MySQL (TypeWriter extension)Redis or ValkeyPacketEventsMiniPlaceholdersUiCore (TypeWriter extension)opcional

Creada para la red BornToCraft. Esta extensión está documentada como referencia y no se distribuye.

Descripción general​

En una red de varios servidores backend, dos jugadores que están en el mismo mapa pero en servidores distintos no pueden verse. Ghost lo soluciona de forma visual: cada servidor publica mediante Redis la posición, la rotación y la skin de sus jugadores, y los demás servidores los dibujan como fantasmas con forma de jugador usando paquetes. No se añade nada al mundo y un fantasma no tiene ninguna entidad en el servidor, por lo que no se le puede golpear, empujar ni apuntar.

Cada jugador decide si ve fantasmas. La elección se almacena en un hecho de TypeWriter, por lo que sobrevive a los reinicios y acompaña al jugador de un servidor a otro. Los fantasmas solo aparecen entre servidores que comparten el mismo redis.group-id en la configuración de MySQL, y un servidor nunca dibuja a sus propios jugadores como fantasmas.

Características​

  • Fantasmas entre servidores: los jugadores de otros servidores backend aparecen con su skin, su posición y su rotación.
  • Renderizado solo por paquetes: construido sobre PacketEvents, no se crea ninguna entidad en el servidor.
  • Compatible con Folia: cada captura y cada renderizado se ejecutan en el planificador del jugador correspondiente.
  • Interruptor de visibilidad: /ghost toggle, una acción de TypeWriter o un botón de menú activan y desactivan los fantasmas por jugador.
  • Elección persistente: la preferencia es un hecho persistible compartido entre servidores.
  • Etiqueta de servidor: un sufijo configurable como [survival-2] indica de dónde procede un fantasma.
  • Límites: la distancia de visión, el máximo de fantasmas por espectador, la frecuencia de actualización y el filtrado de mundos mantienen el coste acotado.
  • Placas de nombre: si UiCore está instalado, los fantasmas reciben una placa de nombre sobre la cabeza.
  • Placeholders: visibilidad y número de fantasmas para texto MiniMessage.

Instalación​

  1. Instala PacketEvents en cada servidor.
  2. Instala la extensión MySQL y activa Redis (o Valkey) en cada servidor. Da a cada servidor un redis.server-name único y el mismo redis.group-id. Ghost no tiene ajustes de Redis propios.
  3. Coloca el JAR de Ghost en plugins/Typewriter/extensions/ y reinicia. El archivo plugins/Typewriter/ghost_player/config.yml se crea en el primer arranque.
  4. Concede el permiso typewriter.ghost.use a los jugadores que puedan usar /ghost. Sin un plugin de permisos, solo pueden los operadores.
  5. Opcional: instala UiCore para dibujar placas de nombre sobre los fantasmas.

Primeros pasos​

Deja que los jugadores activen o desactiven los fantasmas desde un menú o un NPC de misión:

  1. En el panel web de TypeWriter, abre una página y añade una entrada de hecho Ghost Visibility Fact. Conserva su id por defecto, ghost_visibility_fact: la extensión lee y escribe el hecho con este id.
  2. Añade una acción Ghost Toggle Visibility en una secuencia o en un objeto de menú. Rellena showMessage y hideMessage con texto MiniMessage, o déjalos vacíos para usar los mensajes por defecto.
  3. Opcionalmente, añade un criterio sobre el hecho Ghost Visibility (el valor 1 significa visible y 0 oculto) para mostrar un icono distinto en un menú.
  4. Publica y conéctate a dos servidores del mismo grupo. Cada jugador ve al otro como un fantasma con el sufijo del servidor.
Sin fantasmas visibles en un solo servidor

Un servidor ignora sus propias difusiones. Para probarlo, arranca dos servidores con el mismo redis.group-id y distinto redis.server-name, y colócate en mundos que puedan coincidir (consulta más abajo).

Cómo funciona​

Cada servidor publica una instantánea de cada jugador local con la frecuencia configurada, además de un latido para que los jugadores inactivos sigan vivos. Un fantasma desaparece cuando su propietario se va, o cuando no llega ninguna actualización dentro de timeout-millis. Cada mensaje lleva un id de sesión y un número de secuencia, por lo que los mensajes tardíos o duplicados se ignoran.

Un fantasma se dibuja para un espectador cuando este tiene los fantasmas activados, los mundos son compatibles, el fantasma está dentro de view-distance y el espectador tiene menos de max-ghosts-per-viewer fantasmas, empezando por los más cercanos.

Configuración​

El archivo es plugins/Typewriter/ghost_player/config.yml. Su schema-version debe ser 1 o 2.

schema-version: 2

settings:
update-rate: 4
server-suffix: " <gray>[%server%]</gray>"
team-prefix: "Ghosts"
view-distance: 64.0
max-ghosts-per-viewer: 128
timeout-millis: 10000
allowed-worlds:
- "world"
- "dungeon_"
- "hub"

messages:
no-permission: "<red>You do not have permission to use ghost visibility."
players-only: "<red>This command can only be used by a player."
enabled: "<green>Ghost visibility enabled."
disabled: "<yellow>Ghost visibility disabled."
usage: "<gray>Usage: <white>/ghost toggle"

command:
permission: "typewriter.ghost.use"
ClaveSignificado
settings.update-rateTicks entre capturas de posición. Limitado a un valor de 1 a 20.
settings.server-suffixTexto MiniMessage que se añade tras el nombre del fantasma. %server% se convierte en el nombre del servidor de origen.
settings.team-prefixPrefijo del equipo de scoreboard que se muestra para cada servidor de origen.
settings.view-distanceDistancia máxima en bloques, de 0 a 256. 0 desactiva el límite de distancia.
settings.max-ghosts-per-viewerFantasmas dibujados por espectador, de 0 a 2000. 0 no muestra ninguno.
settings.timeout-millisRetraso sin actualizaciones antes de eliminar un fantasma, de 2000 a 120000.
settings.allowed-worldsPatrones de nombres de mundo que cuentan como el mismo mapa entre servidores. Hasta 64 elementos.
messages.*Textos MiniMessage que usa /ghost.
command.permissionPermiso que requiere /ghost.

Mundos. Un fantasma es visible cuando el espectador y el fantasma están en mundos con el mismo nombre, o cuando ambos nombres de mundo contienen el mismo patrón de allowed-worlds (por ejemplo, dungeon_ coincide con dungeon_1 y dungeon_2). La distancia solo se puede medir dentro de un mismo mundo, así que con un view-distance superior a 0, los fantasmas de un mundo con otro nombre se ocultan. Establece view-distance en 0 si dependes de la coincidencia por patrones.

La conexión a Redis, el nombre del servidor y el id de grupo se leen de la configuración de MySQL. El archivo se lee una sola vez al arrancar: reinicia el servidor tras editarlo.

Comandos​

ComandoDescripción
/ghost toggleActiva o desactiva la visibilidad de los fantasmas para ti.

Alias: /ghosts, /ghostplayer. Solo para jugadores. El permiso es command.permission, typewriter.ghost.use por defecto.

Permisos​

PermisoConcede
typewriter.ghost.use/ghost toggle. El nombre se puede cambiar con command.permission. El permiso no se registra con un valor por defecto, por lo que hay que concederlo.

La acción Ghost Toggle Visibility no comprueba este permiso.

Placeholders​

Etiquetas de MiniPlaceholders para texto MiniMessage. PlaceholderAPI no es compatible.

PlaceholderDevuelve
<ghost_visibility>true cuando el jugador ve fantasmas, false en caso contrario.
<ghost_visible>1 cuando el jugador ve fantasmas, 0 en caso contrario.
<ghost_count>Número de fantasmas remotos que este servidor conoce en ese momento.

Entradas​

2 entradas, generadas a partir del código fuente de la extensión.

Acciones1
Hechos1

Resolución de problemas​

No aparece ningún fantasma. Comprueba, por este orden: ambos servidores usan el mismo redis.group-id no vacío y valores de redis.server-name distintos, Redis está conectado (en caso contrario el registro dice "BTC RedisService is not connected; Ghost updates will remain inactive"), el espectador tiene los fantasmas activados y los dos jugadores están en mundos compatibles (mismo nombre de mundo, o un patrón de allowed-worlds compartido con view-distance: 0).

Los jugadores del mismo servidor nunca aparecen como fantasmas. Es lo esperado: un servidor ignora los mensajes que ha publicado él mismo.

La extensión no arranca con "Unsupported Ghost custom config schema". schema-version en ghost_player/config.yml está fuera de 1..2. Establécelo en 2.

La extensión falla con un error de nombre de servidor. redis.server-name en la configuración de MySQL solo debe contener letras, dígitos, ., _ o -, hasta 64 caracteres.

/ghost dice que no tienes permiso. El permiso no tiene valor por defecto. Concede typewriter.ghost.use (o el permiso que hayas definido en command.permission) con tu plugin de permisos.

Los fantasmas desaparecen tras unos segundos. No llegó ninguna actualización dentro de timeout-millis. Comprueba la latencia de Redis y que el servidor de origen ejecuta Ghost con el mismo redis.group-id.

Los fantasmas no tienen placa de nombre. Las placas de nombre proceden de UiCore. Instálalo en el servidor del espectador. Sin él, solo se muestra el sufijo del servidor en el nombre.

Extensiones relacionadas​

  • MySQL: es propietaria de la conexión a Redis, del nombre del servidor y del id de grupo que usa Ghost.
  • UiCore: dibuja placas de nombre sobre los fantasmas cuando está instalado.