Ghost
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
- Instala PacketEvents en cada servidor.
- Instala la extensión MySQL y activa Redis (o Valkey) en cada servidor. Da a cada servidor un
redis.server-nameúnico y el mismoredis.group-id. Ghost no tiene ajustes de Redis propios. - Coloca el JAR de Ghost en
plugins/Typewriter/extensions/y reinicia. El archivoplugins/Typewriter/ghost_player/config.ymlse crea en el primer arranque. - Concede el permiso
typewriter.ghost.usea los jugadores que puedan usar/ghost. Sin un plugin de permisos, solo pueden los operadores. - 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:
- En el panel web de TypeWriter, abre una página y añade una entrada de hecho Ghost Visibility Fact. Conserva su
idpor defecto,ghost_visibility_fact: la extensión lee y escribe el hecho con este id. - Añade una acción Ghost Toggle Visibility en una secuencia o en un objeto de menú. Rellena
showMessageyhideMessagecon texto MiniMessage, o déjalos vacíos para usar los mensajes por defecto. - Opcionalmente, añade un criterio sobre el hecho Ghost Visibility (el valor
1significa visible y0oculto) para mostrar un icono distinto en un menú. - Publica y conéctate a dos servidores del mismo grupo. Cada jugador ve al otro como un fantasma con el sufijo del 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"
| Clave | Significado |
|---|---|
settings.update-rate | Ticks entre capturas de posición. Limitado a un valor de 1 a 20. |
settings.server-suffix | Texto MiniMessage que se añade tras el nombre del fantasma. %server% se convierte en el nombre del servidor de origen. |
settings.team-prefix | Prefijo del equipo de scoreboard que se muestra para cada servidor de origen. |
settings.view-distance | Distancia máxima en bloques, de 0 a 256. 0 desactiva el límite de distancia. |
settings.max-ghosts-per-viewer | Fantasmas dibujados por espectador, de 0 a 2000. 0 no muestra ninguno. |
settings.timeout-millis | Retraso sin actualizaciones antes de eliminar un fantasma, de 2000 a 120000. |
settings.allowed-worlds | Patrones de nombres de mundo que cuentan como el mismo mapa entre servidores. Hasta 64 elementos. |
messages.* | Textos MiniMessage que usa /ghost. |
command.permission | Permiso 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
| Comando | Descripción |
|---|---|
/ghost toggle | Activa 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
| Permiso | Concede |
|---|---|
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.
| Placeholder | Devuelve |
|---|---|
<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
- Ghost Toggle VisibilityToggle Ghost Visibility
Hechos1
- Ghost Visibility FactGhost Visibility
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.