Social Studio ES|EN
Diálogos para NPC

UltraDialogue v1.1.3

Pantallas de diálogo con respuestas que se ramifican, condiciones y acciones. Sin resource pack.

UltraDialogue es un plugin de Paper creado por Social Studio (GupeLegend) que convierte a cualquier NPC —o a cualquier entidad— en un personaje con conversaciones de verdad: un retrato, lo que dice y las respuestas del jugador como botones en pantalla. Usa las pantallas de diálogo nativas que Minecraft introdujo en el cliente 1.21.6, así que no hace falta ningún mod ni, en su presentación básica, ningún resource pack. Cada respuesta puede ramificar la charla, abrir un menú, entregar o pedir objetos, cambiar la afinidad del jugador con ese personaje o ejecutar cualquier comando.

Qué es

UltraDialogue nació como "Dialogos", un plugin privado hecho para un único servidor, y en octubre de 2026 se reescribió y se liberó como UltraDialogue, de código abierto, bajo licencia MIT. El objetivo es simple: que montar una conversación con ramas, condiciones y recompensas sea tan fácil como escribir un archivo YAML, sin depender de un editor gráfico externo ni de un mod de cliente.

Cada diálogo es un archivo .yml dentro de la carpeta dialogues/; el nombre del archivo es el identificador del diálogo. Dentro, una serie de nodos representan cada turno de la conversación: lo que dice el personaje y los botones con los que el jugador responde. Las respuestas pueden llevar a otro nodo, abrir un menú, correr comandos, cambiar la afinidad, entregar objetos o completar misiones — y todo puede estar condicionado a permisos, marcas, afinidad, objetos en el inventario o cualquier placeholder de PlaceholderAPI.

Nota: UltraDialogue no dibuja NPCs ni construye escenarios. Los NPCs, el mundo, las misiones, el Codex y cualquier otra personalización del resource pack que se vean en las capturas de esta página pertenecen al servidor donde se tomaron, no vienen incluidos con el plugin.

Características

  • Conversaciones ramificadas en YAML: nodos, respuestas y hacia dónde lleva cada una.
  • Acciones en cualquier respuesta: ir a otro nodo o diálogo, abrir un menú, ejecutar un comando como jugador o como consola, enviar mensaje / título / barra de acción, reproducir un sonido.
  • Tamaños e íconos de botón: cuatro tamaños de botón como los del menú de pausa (desde el cuadrado pequeño hasta el ancho completo) y un set de diez símbolos de misión — misión, marcador de principal/secundaria/acertijo, aceptar, volver, salir, premio, cuento y probabilidad. Son texto, no necesitan resource pack.
  • El rostro del NPC: una cara 2D tomada de la skin del NPC, junto a su nombre.
  • Filas libres (layout: [1, 2, 2, 1]): cualquier número de botones por fila, algo que la cuadrícula nativa de Minecraft no permite hacer por sí sola.
  • Botones RPG: con el pack de botones opcional (que el propio plugin ofrece al entrar), esos botones se dibujan como un panel con fondo oscuro liso y un marco doble coloreado según su función. Sin el pack, se ven como [ texto ].
  • Respuestas bloqueadas y navegación: respuestas que aún no se pueden elegir se muestran en gris con una pista, un botón Volver que recuerda el camino recorrido y un Salir fijo abajo, además de títulos por nodo.
  • Entregas: comprobar, quitar y dar objetos — vanilla, trofeos de UltraBoss o cualquier ítem por su etiqueta oculta, su modelo o su nombre. Quitar es todo o nada y se revisa otra vez al hacer clic, para que no haya duplicaciones.
  • Bloqueos de historia y misiones: condiciones sobre misiones de BeautyQuests (quest: completed 12), su propio tipo de etapa de BeautyQuests, y placeholders de afinidad y marcas.
  • Condiciones: ocultan respuestas o cambian por dónde empieza la charla — permisos, marcas del jugador y cualquier placeholder de PlaceholderAPI (%vault_eco_balance% >= 1000).
  • Marcas de jugador: recuerdan que alguien ya conoció a un personaje, aceptó un trabajo o terminó un paso, para saludarlo distinto la próxima vez. Se guardan en el propio jugador, sin base de datos.
  • Afinidad: un nivel de amistad oculto por jugador y por personaje. Las respuestas amables lo suben, las groseras lo bajan, y según crece se desbloquean saludos, preguntas y secretos nuevos. El jugador nunca se entera de que cambió.
  • Conversaciones que nunca se repiten igual: varias variantes por línea (una distinta cada vez) y preguntas que rotan, para que hablar dos veces con el mismo NPC no se sienta guionado.
  • Retratos: la skin del propio NPC, la de cualquier jugador, una textura fija o un ítem.
  • Soporte de FancyNpcs de fábrica: vincular un diálogo a un NPC por su nombre hace que al hacer clic se abra la charla en vez de sus acciones de FancyNpcs. Tu npcs.yml nunca se toca.
  • Cualquier entidad puede hablar, con una etiqueta: /tag @e[type=villager,limit=1,sort=nearest] add dialogue:merchant.
  • Clientes antiguos que entran por ViaVersion (anteriores a 1.21.6) reciben la misma conversación en el chat, con respuestas en las que se puede hacer clic.
  • Inglés y español incluidos de fábrica — y, como se explica más abajo, también en las claves de los propios archivos de diálogo.

Requisitos y compatibilidad

Paper 26.1.2 (objetivo de servidor verificado)
Java 25
api-version 26.1.2
Folia No soportado (folia-supported: false)
Bedrock / Geyser No verificado

El respaldo de chat para clientes antiguos (vía ViaVersion) no implica compatibilidad con versiones de servidor anteriores a la 26.1.2: solo cambia cómo recibe el diálogo un cliente viejo, no qué servidor lo ejecuta.

Todo lo demás es opcional y se detecta en tiempo de ejecución:

Plugin Para qué se usa
FancyNpcs Hacer clic en un NPC abre su diálogo
PlaceholderAPI Placeholders en textos, acciones y condiciones
DeluxeMenus La acción menu: (cualquier plugin de menús funciona cambiando menu-command)
ViaVersion Envía a los clientes antiguos la versión en chat
BeautyQuests 2.1 Condiciones y acciones de misión, el tipo de etapa ULTRADIALOGUE

Importante: estos cinco plugins están listados como softdepend en plugin.yml, así que UltraDialogue arranca sin ninguno de ellos. Si falta alguno, la parte que depende de él simplemente queda inactiva (por ejemplo, las condiciones de misión son siempre falsas sin BeautyQuests) y la consola lo avisa una sola vez por diálogo.

Instalación

  1. Suelta el .jar en plugins/ y arranca el servidor. Al iniciar por primera vez se crean tres diálogos de ejemplo (example.yml, merchant.yml y kadir.yml).
  2. Los datos del plugin viven en plugins/UltraDialogue/, su propia carpeta normal de Bukkit. Si vienes de una versión que todavía usaba la carpeta compartida plugins/UltraView/UltraDialogue/, el plugin mueve todo automáticamente la primera vez que arranca (lo anuncia una vez en consola, y borra la carpeta vieja solo cuando queda vacía). Tu config.yml y tus diálogos nunca se sobrescriben en una actualización.
  3. Los símbolos de los íconos no necesitan ningún pack. Para que los paneles RPG internos se sirvan solos hace falta una dirección pública alcanzable y un puerto (8083 por defecto). Un fallo al abrir el puerto queda registrado en consola, pero un bloqueo de firewall o NAT puede verse solo como una descarga fallida del lado del cliente. Con buttons: auto, los jugadores solo ven paneles tras una carga exitosa del pack; si falla, simplemente ven la presentación de texto.
  4. Cada vez que edites un diálogo, corre /ud reload. La consola te dice qué archivo, qué nodo y qué referencia está rota si algo falla. /ud reload no cierra las conversaciones activas: ciérralas y vuelve a abrirlas después de recargar su definición. Los cambios de puerto o de entrega del pack sí requieren reiniciar el servidor; recargar no reinicia el servidor del pack.

Consejo: si otro plugin (por ejemplo EcoItems) ya te entrega un resource pack fusionado, no necesitas que UltraDialogue sirva el suyo por separado. En Configuración más abajo se explica cómo fusionar el ZIP del plugin en ese pack externo y cambiar a buttons: pack.

Vamos a crear un personaje desde cero: un vigía que saluda distinto la primera vez, y que ofrece abrir una tienda o contar un secreto.

Paso 1 — crea el archivo. Copia dialogues/example.yml (o créalo desde cero) como dialogues/vigia.yml. El nombre del archivo, sin la extensión, es el identificador del diálogo: vigia.

Paso 2 — escribe la cabecera. name es lo que se ve como encabezado de la pantalla; npcs son los nombres de NPC de FancyNpcs que deben abrir este diálogo al hacer clic (puede quedar vacío si vas a usarlo con una etiqueta de entidad o con /ud open); portrait es la imagen junto al texto, con alternativas separadas por |.

Paso 3 — decide por dónde empieza. start es una lista de reglas; se usa la primera cuyo if se cumpla. Aquí usamos una marca para distinguir la primera visita.

Paso 4 — escribe los nodos. Cada nodo es un turno: su text (lo que dice el personaje) y sus answers (los botones del jugador).

name: '&b&lEl Vigía'
npcs: [vigia]
portrait: 'npc | item:SPYGLASS'
sound: 'entity.villager.ambient 0.6 1.1'

start:
  - if: '!flag:vigia_visto'
    node: primera_vez
  - node: menu

nodes:
  primera_vez:
    on-show: ['flag: vigia_visto']
    text:
      - 'Alto ahí. No muchos suben hasta esta torre.'
      - 'Mientras no causes problemas, eres bienvenido.'
    next: menu                 # sin "answers": un único botón "Continuar"

  menu:
    text: '¿Qué necesitas?'
    answers:
      - text: '&2Ver la tienda'
        icon: accept
        actions: ['menu: shop']
      - text: '&7¿Qué se ve desde aquí?'
        tooltip: '&7El vigía conoce cada camino.'
        goto: vista
      - text: '&8Nada, gracias'
        goto: end

  vista:
    text: 'Desde esta torre veo todo el valle... y a quien se acerque por él.'
    answers:
      - text: '&7« Volver'
        goto: menu

Paso 5 — pruébalo. Sin necesidad de ningún NPC, abre el diálogo directamente:

/ud open vigia

Paso 6 — recarga y vincula. Si editas el archivo mientras el servidor corre, usa /ud reload. Para que un NPC real de FancyNpcs lo abra al hacer clic, crea el NPC con el nombre vigia (el nombre interno, no el de display) — eso es todo, no hace falta tocar npcs.yml. Si usas otra entidad (un aldeano, por ejemplo), etiquétala en vez de usar FancyNpcs: /tag @e[type=villager,limit=1,sort=nearest] add dialogue:vigia.

dialogues/example.yml trae, comentada, prácticamente cada opción que existe — es el mejor punto de partida para copiar y pegar.

Formato de los diálogos

Cada archivo acepta sus claves en inglés o en español indistintamente (así los archivos del plugin privado anterior, "Dialogos", cargan sin tocarlos). La tabla siguiente reúne cada clave con su alias en español.

Inglés Alias en español Dónde se usa
name nombre cabecera del diálogo
portrait retrato cabecera
sound sonido cabecera y nodo
columns columnas cabecera y nodo
start inicio cabecera
node nodo dentro de una regla de start
if si condiciones (regla de inicio, respuesta, variante)
nodes nodos cabecera
speaker (también name/nombre) — nodo: quién habla en ese turno
text texto nodo y variante
variants variantes nodo
on-show al-mostrar nodo
next siguiente nodo
show mostrar nodo
title titulo / título nodo
answers respuestas nodo
nav navegacion / navegación nodo
layout filas nodo
tooltip — respuesta
goto ir respuesta
actions acciones respuesta, on-show
always siempre respuesta
icon icono respuesta
size tamano / tamaño respuesta
width ancho respuesta
locked bloqueada / bloqueado respuesta
style estilo respuesta, nodo, diálogo
border borde respuesta, nodo, diálogo
border-color color-borde respuesta, nodo, diálogo
fill-color color-fondo respuesta, nodo, diálogo
affinity afinidad cabecera (sección propia) y acción

Nota: el código del plugin está íntegramente en inglés (identificadores, comentarios, mensajes de consola); el soporte bilingüe es únicamente para las claves de los archivos de diálogo.

Cabecera del archivo

name: '&2&lThe Wandering Merchant'   # título que aparece arriba de la pantalla
npcs: [merchant]                     # nombres de NPC de FancyNpcs que abren este diálogo
portrait: 'npc | item:EMERALD'       # alternativas separadas por "|": la primera que se pueda mostrar gana
sound: 'entity.villager.ambient 0.7 1'   # opcional; si falta, usa talk-sound de config.yml
columns: 1                           # botones por fila por defecto para todo este diálogo (opcional)

El retrato (portrait) acepta, separadas por | como alternativas:

Valor Qué muestra
npc la skin del NPC o la entidad que abrió la charla, como cara 2D
player:Nombre (jugador:) la skin de ese jugador
texture:<base64> (textura:) una textura fija, como cara 2D
item:MATERIAL el ítem a la izquierda del texto (no muestra cara)
none nada

start: dónde empieza la conversación

Una lista de reglas; gana la primera cuyo if se cumpla. Un start: nombre_de_nodo suelto (sin lista) también funciona, para diálogos que siempre empiezan igual.

start:
  - if: 'affinity >= 25'
    node: amigo
  - if: '!flag:conocido'
    node: primera_vez
  - node: normal

Nodos (nodes)

Cada nodo es un turno de la conversación. Sus campos:

Campo Qué hace
speaker quién habla en este turno (si no, el nombre del diálogo)
text una línea o una lista de líneas que dice el personaje
variants en vez de text, varias versiones de la línea; se elige una al azar cada vez, nunca la misma dos veces seguidas. Cada variante puede tener su propio if
on-show acciones que corren apenas se muestra el nodo (poner una marca, dar un ítem, reproducir un sonido...)
answers la lista de respuestas-botón del jugador
next si el nodo no tiene answers, un único botón "Continuar" lleva a este nodo
show si es mayor que 0, solo se muestran esa cantidad de respuestas no marcadas como always, elegidas al azar cada vez
columns botones por fila, solo para este nodo
title encabezado de pantalla solo para este nodo (si no, el nombre del personaje)
nav botones de navegación (Volver, Salir, o una respuesta completa) en la última fila
layout botones por fila, fila por fila — ver Filas libres

Respuestas (answers)

answers:
  - text: '&2Muéstrame tus productos'
    icon: accept
    size: 2
    tooltip: '&7Abre el menú "shop"'
    if: 'permission:group.vip'
    locked: '&7Solo para VIP.'
    actions: ['menu: shop']
    goto: fin_amable
Campo Qué hace
text el texto del botón (puede ir vacío si solo lleva ícono, con size: 1)
tooltip texto que aparece al pasar el cursor por encima
if condición(es) para mostrar la respuesta — ver Condiciones
locked si el if falla, en vez de ocultar la respuesta la muestra en gris con este aviso (locked: true usa el texto por defecto del idioma)
actions lista de acciones que corren al hacer clic — ver Acciones
goto a qué nodo lleva después de las acciones (end o fin termina la charla)
always no cuenta para la rotación de show — siempre aparece
icon nombre de uno o varios íconos (icon: quest side)
size / width tamaño del botón — ver Botones
style / border / border-color / fill-color apariencia del panel RPG de esta respuesta, si force/force-colors lo permiten
nav:
  - back                              # pantalla anterior de esta conversación
  - text: '&eRecompensa'              # cualquier respuesta completa también funciona en nav
    actions: ['console: give %player% emerald 1']
  - exit                              # fijo al pie de la pantalla
  • back recorre hacia atrás el historial de pantallas de esta conversación, incluso entre diálogos distintos. En la primera pantalla, cierra la charla (siempre se muestra, para no romper la forma de la cuadrícula).
  • exit va en el pie de la pantalla. Minecraft solo tiene espacio para un botón fijo ahí; back y el resto de nav ocupan la última fila de la cuadrícula.
  • Sin nav:, aparece un botón "Adiós" al final.

Botones, tamaños e íconos

Tamaños

Tamaño Ancho Equivalente en el menú de pausa
size: 1 20 px el botón cuadrado pequeño ("informar")
size: 2 98 px "Opciones...", media anchura
size: 3 150 px un botón mediano
size: 4 204 px "Desconectar", anchura completa
width: 130 cualquiera, 1–1024 px ancho exacto

Los botones nativos miden 20 px de alto; los paneles de filas libres (con el pack), 24 px. columns: controla la cuadrícula nativa, para todo el diálogo o un solo nodo; layout: controla las filas libres.

Íconos

/ud icons los lista en el juego, dibujados tal como los ve ese jugador. Desde la 1.1.2 son símbolos de texto, así que se ven igual con o sin resource pack:

Nombre Inglés Símbolo Significado
mision quest ! (naranja) hay una misión
principal main • (verde) marca: misión principal
secundaria side • (azul) marca: misión secundaria
acertijo riddle • (morado) marca: acertijo
aceptar accept ✓ (verde) aceptar
volver back « volver
salir exit × (rojo) salir
premio reward ± (amarillo) recompensas de misión
cuento story ♪ (celeste) una historia que cuenta el NPC
probabilidad chance % algo puede pasar (o caer) por probabilidad

Varios íconos en un mismo botón, separados por espacios: icon: quest side muestra ! • con el marcador azul. [quest, side] y quest+side también funcionan.

Importante: la 1.1.2 reemplazó los 20 íconos de pixel art de la 1.1.1 (heart, gem, gift, star, shop...). Un ícono que ya no existe no rompe nada: el botón se muestra sin él y la consola avisa una sola vez por diálogo. Si vienes de la 1.1.1, revisa tus respuestas que solo tenían ícono (sin texto): ahora quedarían con el botón en blanco.

Filas libres (layout) y paneles RPG

Minecraft solo deja a los servidores organizar los botones reales en una cuadrícula uniforme, con una única excepción: un botón suelto al final puede ocupar su propia fila. Eso basta para un diseño "2 + 2 + 1 ancho", pero no para "1 ancho + 2 + 2" ni para tres botones pequeños juntos en una fila (Volver · Salir · Recompensa).

layout: [1, 2, 2, 1] resuelve eso dibujando los botones como texto clicable dentro del cuerpo del diálogo, en vez de como botones reales:

nodes:
  menu:
    title: '&6Misiones de Brann'
    text: '¿Qué quieres preguntar?'
    layout: [1, 2, 2, 1]
    answers:
      - {text: '&fMisión principal', icon: quest main, goto: principal}
      - {text: '&fMisión secundaria', icon: quest side, goto: q1}
      - {text: '&fMisión secundaria', icon: quest side, goto: q2}
      - {text: '&fAcertijo', icon: quest riddle, if: 'affinity >= 10', locked: '&7Todavía no.', goto: q3}
      - {text: '&fUna historia', icon: story, goto: q4}
      - {text: '&7Solo pasaba por aquí', goto: end}
    nav:                              # botones REALES, todos en una fila, en este orden
      - back
      - exit
      - {text: '&eRecompensa', icon: reward, actions: ['console: give %player% emerald 1'], goto: menu}

Diseños de filas libres con botones en distintas formas de fila

Pantallas reales de un servidor configurado con layout:: cada fila tiene su propia cantidad de botones, algo que la cuadrícula nativa de Minecraft no permite por sí sola.

  • Las filas se llenan con las respuestas en orden; las que sobran van una por fila.
  • Los botones de nav: son botones reales de Minecraft, todos en una fila al pie, en el orden en que se escriben — así Volver, Salir y una "Recompensa" pueden quedar lado a lado.
  • Sin el pack, cada botón de layout: se ve como [ texto ], con el formato de screen.layout.button-format de config.yml. Con el pack cargado (y buttons: auto o pack), se dibuja como un panel: fondo oscuro liso y marco doble, coloreado según el último ícono con color que tenga el botón.
  • Límite: los paneles de layout: no se iluminan al pasar el cursor por encima (solo la línea de texto responde al clic); la fila de nav: sí, porque es nativa.

Tablero de misiones con marcos de colores por tipo de encargo

El marco de cada panel sigue el color del último ícono: naranja para misión, verde para principal, azul para secundaria, morado para acertijo.

El pack que dibuja estos paneles es muy liviano desde la 1.1.3: solo incluye el fondo liso y el borde doble (antes había diez fondos y diez bordes distintos). Nombres de estilo o borde más antiguos en un archivo de diálogo o en config.yml siguen cargando sin error: cae de vuelta en liso/doble con un aviso de consola, una sola vez por nombre.

Respuestas y ramas

La forma más simple de ramificar es encadenar goto: cada respuesta lleva a otro nodo, y ese nodo tiene sus propias respuestas. end (o fin) como destino termina la charla.

Para que la misma conversación no se sienta siempre idéntica:

  • variants: da varias versiones de una línea; se elige una al azar cada vez que se muestra el nodo, nunca la misma dos veces seguidas. Cada variante puede llevar su propio if.
  • show: N muestra solo N de las respuestas del nodo (de entre las que no tienen always: true), elegidas al azar en cada visita. Útil para que un NPC no suelte siempre las mismas cinco preguntas en el mismo orden.
  • always: true saca a una respuesta de esa rotación: siempre aparece (típicamente la despedida).
stranger:
  variants:
    - '¿Sí? ¿Qué quieres?'
    - 'No suelo hablar con desconocidos.'
  show: 2
  answers:
    - text: 'Hola, ¿quién eres?'
      goto: quien
    - text: '¿De dónde vienes?'
      goto: origen
    - text: 'Lindo compás.'
      goto: compas
    - text: 'Adiós.'
      always: true
      goto: end

Afinidad

Cada jugador tiene un número oculto de afinidad con cada personaje, empezando en 0. Las respuestas lo cambian y las condiciones lo leen — así el mismo NPC puede ser frío con desconocidos y abrirse con los amigos:

start:
  - if: 'affinity >= 25'
    node: amigo
  - node: desconocido

nodes:
  desconocido:
    answers:
      - text: 'Hola. ¿Quién eres?'
        actions: ['affinity: +2']
        goto: quien
      - text: 'Quítate de mi camino.'
        actions: ['affinity: -3']
        goto: end
  • El jugador nunca ve el número ni se entera de que cambió. El staff puede consultarlo con /ud affinity <jugador> <id>.
  • Anti-farmeo: un personaje solo da afinidad una vez cada cooldown-minutes (30 por defecto) y como máximo max-per-talk puntos (3) por conversación. Perder afinidad no tiene límite.
  • Los valores por defecto viven en config.yml, bajo affinity:; cada diálogo puede traer su propia sección affinity: para sobrescribirlos solo para ese personaje.
  • Solo existe en los diálogos que la usan: un NPC de menú que nunca menciona afinidad se comporta exactamente igual que antes de que existiera esta función.
  • Una variante puede tener su propio if ({text: '...', if: 'affinity >= 10'}).

dialogues/kadir.yml, incluido con el plugin, es un ejemplo completo con cuatro niveles de amistad, preguntas que rotan y un regalo de una sola vez.

Condiciones

Se usan en if: — de una regla de start, de una respuesta, de una variante o de locked:. Cada línea de la lista debe cumplirse (son un AND); dentro de una misma línea, || significa "o".

if:
  - 'permission:group.vip || permission:ultradialogue.admin'
  - '!flag:ya_hablado'
Condición Alias en español Verdadera cuando
permission:<nodo> permiso: el jugador tiene ese permiso
flag:<nombre> marca: el jugador tiene esa marca
has: ITEM N tiene: el jugador lleva al menos N de ese ítem, en cualquier parte del inventario
hand: ITEM N mano: lleva al menos N de ese ítem en la mano principal
quest: completed <id> mision: completada / terminada terminó esa misión de BeautyQuests
quest: started <id> mision: en-curso / empezada la empezó y no la ha terminado
quest: active <clave> mision: activa está ahora mismo en una etapa ULTRADIALOGUE con esa clave
affinity >= N afinidad su afinidad con este personaje cumple la comparación
affinity:<id> >= N afinidad:<id> su afinidad con otro personaje cumple la comparación
%placeholder% >= N — cualquier placeholder de PlaceholderAPI, comparado

Cualquier condición puede negarse con ! al principio (!flag:conocido), salvo que empiece por !=, que es el operador "distinto de".

Las comparaciones con placeholders aceptan ==, !=, >=, <=, >, < y contains (contiene):

if: '%vault_eco_balance% >= 1000'
if: '%player_name% contains Gupe'

Nota: la comparación numérica entiende tanto 1.234,50 como $1,234.50 — los dos formatos más comunes con los que los plugins de economía dan sus placeholders.

Sin BeautyQuests instalado, todo el plugin sigue cargando con normalidad: las condiciones de misión simplemente son siempre falsas, y la consola lo avisa una sola vez por diálogo.

Cuadrícula de respuestas con entradas bloqueadas en gris

Las respuestas con locked: se muestran atenuadas mientras su condición no se cumple; al hacer clic solo aparece el aviso en la barra de acción, sin ejecutar nada.

Acciones

Se usan en actions: (de una respuesta o de on-show). Se ejecutan en orden, de arriba hacia abajo.

Acción Alias Qué hace
goto: nodo ir: va a otro nodo (end termina la charla)
dialogue: id [nodo] dialogo: / dialog: cambia a otro diálogo, opcionalmente en un nodo concreto
menu: nombre — abre un menú (corre menu-command de config.yml; DeluxeMenus por defecto)
command: spawn comando: ejecuta el comando como el jugador
console: give %player% diamond 1 consola: lo ejecuta la consola
message: texto mensaje: mensaje privado al jugador
broadcast: texto anuncio: mensaje a todo el servidor
actionbar: texto — texto en la barra de acción
title: Título\|Subtítulo titulo: título en pantalla
sound: entity.villager.yes 1 1 sonido: también acepta ENTITY_VILLAGER_YES
flag: nombre marcar: pone una marca en el jugador
unflag: nombre desmarcar: la quita
affinity: +2 / -3 / =10 afinidad: cambia la afinidad (con otro personaje: affinity: otro_id +2)
take: ITEM N quitar: quita N de ese ítem (todo o nada)
give: ITEM N dar: entrega N de ese ítem
quest: complete <clave> mision: completar completa toda etapa ULTRADIALOGUE con esa clave que el jugador tenga activa
quest: start <id> mision: empezar inicia la misión, respetando sus requisitos
quest: force <id> mision: forzar la inicia sin requisitos
close cerrar: cierra la pantalla
actions:
  - 'message: &6¡Eres VIP!'
  - 'sound: ENTITY_PLAYER_LEVELUP'

Importante: cuando una respuesta termina la charla (abre un menú, corre un comando...) la pantalla se cierra antes de ejecutar las acciones, para que el menú que se abre quede al frente.

Entregas: objetos, tienda y recompensas

Las condiciones has:/hand: y las acciones take:/give: reconocen varios formatos de ítem, cada uno con un número al final (por defecto, 1):

Formato Con qué coincide
IRON_INGOT / minecraft:iron_ingot ese material vanilla — solo ítems simples: uno con etiqueta oculta o modelo propio de otro plugin no cuenta, así un ítem vanilla nunca confunde un trofeo de UltraBoss con un lingote cualquiera
ultraboss:<id> un ítem de UltraBoss (también bajo sus nombres anteriores)
ultrarevive:self / boost / end un tótem de UltraRevive
pdc:<espacio:clave>=<valor> la etiqueta oculta de cualquier plugin
item_model:<espacio:modelo> por su modelo de ítem
name:&6Llave de la bodega (nombre:) por su nombre visible (último recurso)
deliver:
  text: '¿Trajiste el hierro para la forja?'
  answers:
    - text: '&aEntregar 16 lingotes de hierro'
      icon: accept
      if: 'has: IRON_INGOT 16'
      actions:
        - 'take: IRON_INGOT 16'
        - 'give: EMERALD 4'
        - 'affinity: +3'
      goto: gracias
    - text: '&8Todavía no los tengo'
      if: '!has: IRON_INGOT 16'
      goto: end
  • take: es atómico: cuenta primero y no quita nada si falta alguno. Primero la mano principal, luego el resto del inventario.
  • Si take: falla, se corta el resto de las acciones de esa respuesta — nunca se entrega una recompensa sin haber cobrado primero. El jugador recibe el mensaje item-missing.
  • Las condiciones se revisan de nuevo al hacer clic. Si abres el diálogo con 16 lingotes, los sueltas y luego presionas "Entregar", no se quita ni se entrega nada: la pantalla simplemente se vuelve a dibujar.
  • give: construye los ítems vanilla por su cuenta; los de UltraBoss y UltraRevive se entregan con el comando propio de cada plugin, así conservan todas sus etiquetas, nombre y textura.
  • Una regla de start puede reaccionar a lo que el jugador tiene en la mano: if: 'hand: IRON_INGOT 16'.

Misiones y BeautyQuests

start:
  - if: '!quest: completed 12'
    node: muy_pronto
  - node: escena_final

UltraDialogue registra su propio tipo de etapa en BeautyQuests, ULTRADIALOGUE, así un NPC con diálogo puede formar parte de una misión de forma nativa:

# en el archivo de misión de BeautyQuests
'3':
  stageType: ULTRADIALOGUE
  key: brann_hierro
  npc: brann                  # opcional, solo para la descripción
  customText: '§7Lleva §f16 lingotes de hierro §7a §fBrann'
# en el diálogo
- text: '&aEntregar el hierro'
  icon: accept
  if: ['quest: active brann_hierro', 'has: IRON_INGOT 16']
  actions: ['take: IRON_INGOT 16', 'quest: complete brann_hierro']

También se puede crear desde el editor en el juego de BeautyQuests (pide la clave). Dos misiones con la misma clave avanzan a la vez.

quest: complete dispara un evento normal de Bukkit, DialogueSignalEvent(player, key), que cualquier plugin puede escuchar, con o sin BeautyQuests instalado.

Asignar diálogos a NPCs y abrirlos

Hay cuatro formas de que una conversación arranque:

  1. FancyNpcs. Pon el nombre interno del NPC (el que usaste en /npc create, no el de display) en la lista npcs: del diálogo. Al hacer clic derecho (o izquierdo, si left-click: true en config.yml) se abre la conversación en lugar de las acciones propias de FancyNpcs. npcs.yml nunca se modifica: quitar el NPC de esa lista lo devuelve a su comportamiento normal.
  2. Cualquier entidad, con una etiqueta. /tag @e[type=villager,limit=1,sort=nearest] add dialogue:merchant (la etiqueta antigua dialogo: también funciona). Sirve para aldeanos, armor stands o cualquier entidad que no venga de FancyNpcs.
  3. El comando /ud open. Funciona desde la consola o como acción de otro plugin, y no requiere que haya ningún NPC cerca.
  4. Como acción de otro diálogo, con dialogue: id [nodo].

Al abrirse por clic en un NPC o una entidad etiquetada hay, además, un enfriamiento (cooldown-ms en config.yml, 700 ms por defecto) y una distancia máxima (max-distance, 8 bloques) más allá de la cual las respuestas dejan de funcionar — así nadie puede alejarse a mitad de charla y seguir presionando botones desde lejos.

El editor de botones (/ud)

Desde la 1.1.3, /ud sin argumentos (o /ud editor de forma explícita) abre un menú dentro del juego para administradores: elegir un diálogo, elegir uno de sus nodos y ver sus botones — tanto las respuestas principales como la fila nav:.

El editor solo toca botones. Las propias líneas del NPC, sus condiciones, sus acciones y la afinidad se siguen editando en el archivo .yml del diálogo; el menú lo recuerda en su ayuda. "Guardar" reescribe únicamente las líneas answers:, nav: y layout: de ese nodo — cada otro nodo, cada otra clave y los comentarios del resto del archivo quedan intactos.

Para cada botón se puede:

  • Editar su texto — el menú se cierra, escribes la línea nueva en el chat (o cancelar para dejarla como está), y el menú se vuelve a abrir.
  • Cambiar su ícono — uno de los 10 presets aprobados, o ninguno.
  • Cambiar su tamaño — recorre automático / 1 / 2 / 3 / 4 (clic derecho para ir hacia atrás).
  • Moverlo arriba o abajo, o, en un nodo con layout:, moverlo a otra fila.
  • Borrarlo, con un paso de confirmación.
  • Agregar uno nuevo — eligiendo un botón existente como plantilla (su goto, sus actions y sus condiciones se copian tal cual), y luego editando su texto e ícono.

"Probar" abre el diálogo tal como está guardado en ese momento; "Guardar" escribe los botones en el archivo; "Cancelar", o simplemente cerrar el menú, descarta cualquier cambio sin guardar. El permiso es el mismo ultradialogue.admin que cualquier otro subcomando de /ud.

Menús de categorías con botones coloreados y jerarquía de submenús

Cada categoría usa su propio color de marco; "Volver" y "Salir" quedan siempre como botones nativos al pie de la pantalla.

Comandos

Todos los subcomandos administrativos requieren el permiso ultradialogue.admin (op por defecto). Alias del comando: /ud, /dialogue, /dialogo. El permiso heredado dialogos.admin también lo concede.

Comando Alias en español Qué hace
/ud o /ud editor — abre el editor de botones (solo dentro del juego)
/ud open <id> [jugador] [nodo] /ud abrir abre un diálogo a mano — funciona desde la consola y desde otros plugins
/ud reload /ud recargar recarga la configuración, el idioma y todos los diálogos
/ud list /ud lista diálogos cargados y sus NPCs
/ud flags <jugador> [clear [marca]] /ud marcas ... [borrar [marca]] ver o borrar las marcas de un jugador
/ud affinity <jugador> [id] [set\|add\|reset] [n] /ud afinidad ver o cambiar la afinidad (solo staff; add ignora los límites anti-farmeo)
/ud icons /ud iconos cada ícono con su nombre, dibujado tal como lo ve ese jugador

Los jugadores no necesitan ningún permiso para hablar con los NPCs.

Permisos

Permiso Por defecto Qué otorga
ultradialogue.admin op abrir, recargar y administrar diálogos, incluido el editor de botones
dialogos.admin false (hereda ultradialogue.admin) nodo de compatibilidad con el nombre anterior del plugin ("Dialogos")

Configuración

config.yml completo, con sus valores por defecto reales:

# en | es — idioma de los mensajes del plugin
language: en

# dialog = la pantalla nativa de diálogo (Minecraft 1.21.6+)
# chat   = texto con respuestas clicables en el chat
# Los clientes anteriores a 1.21.6 (que entran por ViaVersion) siempre reciben la versión de chat.
mode: dialog

# legacy = &a &l &#ff8800   |   minimessage = <green> <bold> <#ff8800>
format: legacy

# Comando de consola que corre la acción "menu: <nombre>". Por defecto abre un menú de DeluxeMenus.
menu-command: 'dm open {menu} {player}'

screen:
  text-width: 260
  button-width: 220
  columns: 1
  close-with-esc: true
  exit-button: false       # agrega un botón "Adiós" debajo de las respuestas de cada pantalla
  nav-width: 64             # ancho de los botones de nav (volver, salir, premio...)
  locked-color: '&8'        # color de una respuesta "locked" mientras su "if" no se cumple
  locked-sound: 'block.note_block.bass 0.6 0.8'
  layout:
    button-format: '&8[ {text}&8 ]'     # "{text}" = el texto de la respuesta
    locked-format: '&8[ {text}&8 ]'
    gap: 2                              # espacios entre dos botones de la misma fila
    row-width: full                     # full = todas las filas del mismo ancho · fit = cada fila según su texto · un número = ancho mínimo en píxeles
    buttons: auto                       # auto = paneles dibujados solo para quien cargó el pack · pack = siempre dibujados · text = siempre "[ texto ]"
    look: filled
    style: liso
    border: doble
    force: true              # true = aplica este estilo/borde a TODO diálogo, ignorando los suyos propios
    force-colors: true        # true = usa los colores semánticos, ignorando los colores propios de cada diálogo
    force-border: false       # true = aplica el "border" de arriba a todo diálogo, pero cada uno conserva su propio fondo
    border-colors:
      default: '#FFFFFF'      # preguntas (sin ícono)
      mision: '#F2B21E'
      principal: '#4CD964'
      secundaria: '#4F8BFF'
      acertijo: '#B36BFF'
      aceptar: '#4CD964'
      premio: '#FFD23F'
      cuento: '#7FD6FF'
      probabilidad: '#FF9F43'
      volver: '#C6E86B'
      salir: '#E04B4B'
      locked: '#5A5A5A'

left-click: false           # solo clic derecho abre un diálogo; true = también el izquierdo
cooldown-ms: 700             # milisegundos entre dos clics sobre el mismo NPC
max-distance: 8.0            # si el jugador se aleja más de esto del NPC, las respuestas dejan de funcionar
talk-sound: 'entity.villager.ambient 0.6 1.1'   # sonido en cada línea del NPC; cada diálogo puede sobrescribirlo

affinity:
  min: 0
  max: 100
  cooldown-minutes: 30       # un personaje solo DA afinidad una vez cada tantos minutos por jugador (anti-farmeo)
  max-per-talk: 3            # máximo de afinidad que una sola conversación puede dar

icons:
  mode: auto                 # auto = imágenes para quien cargó el pack, símbolos de texto para el resto · sprite = siempre imágenes · text = siempre símbolos

resource-pack:
  enabled: true
  mode: internal              # internal | url
  host: "AUTO"                # AUTO consulta api.ipify.org por la IP pública del servidor
  port: 8083
  url: ""
  force: false
  prompt: ""                  # vacío = usa el texto del archivo de idioma

Consejo: si otro proveedor externo (por ejemplo EcoItems) entrega el resource pack fusionado, desactiva la entrega propia de UltraDialogue y asume que el pack ya trae la fuente:

resource-pack:
  enabled: false
screen:
  layout:
    buttons: pack

Funde esas claves en el config.yml ya existente; no reemplaces el archivo completo ni dupliques la sección screen:. buttons: pack asume que la fuente ya está presente y no puede confirmar el estado de un proveedor externo. Para el modo mode: url del plugin, el proveedor externo debe servir exactamente los mismos bytes del pack incluido en el jar: su hash se calcula a partir del ZIP embebido, no de un pack fusionado por fuera.

Placeholders e integraciones

PlaceholderAPI

Placeholder Valor
%ultradialogue_affinity_<id>% la afinidad del jugador con ese personaje
%ultradialogue_flag_<marca>% true / false

Sirven como requisitos reales en BeautyQuests (placeholderRequired), para bloquear ítems de menú en DeluxeMenus, o en cualquier otro plugin que lea placeholders.

FancyNpcs

Vincula un diálogo a un NPC listándolo en npcs:; al hacer clic se abre la conversación en vez de las acciones propias del NPC. npcs.yml nunca se toca.

DeluxeMenus (o cualquier plugin de menús)

La acción menu: nombre corre el comando de menu-command en config.yml (por defecto, dm open {menu} {player}, de DeluxeMenus). Cambiando esa línea funciona con cualquier otro plugin de menús que acepte un comando de consola.

ViaVersion

Los clientes con una versión anterior a 1.21.6 reciben la misma conversación como texto en el chat, con respuestas en las que se puede hacer clic, sin que el servidor operador tenga que hacer nada extra.

BeautyQuests 2.1

Condiciones (quest:) y acciones (quest:) de misión, y el tipo de etapa propio ULTRADIALOGUE — ver Entregas: objetos, tienda y recompensas.

Confirmaciones de misión con sus requisitos y recompensas a la vista

Antes de aceptar un encargo, el jugador ve de qué trata, quién lo pide, los pasos y la recompensa — todo construido con layout: y condiciones sobre el inventario.

Jugadores de Bedrock

El comportamiento con Bedrock/Geyser no está verificado. El único respaldo confirmado y documentado es el de clientes Java anteriores a la 1.21.6 a través de ViaVersion, que reciben la conversación en el chat en vez de la pantalla nativa. Si administras un servidor cross-play, prueba el comportamiento en tu propia configuración antes de darlo por sentado, y considera forzar mode: chat si necesitas una presentación uniforme para todos los jugadores.

Ejemplos completos

Una tienda ambulante

Basado en dialogues/merchant.yml, incluido con el plugin: saluda distinto la primera vez y abre un menú de DeluxeMenus.

name: '&2&lEl Mercader Errante'
npcs: [mercader]
portrait: 'npc | item:EMERALD'
sound: 'entity.wandering_trader.ambient 0.7 1'
start:
  - if: '!flag:conocio_mercader'
    node: intro
  - node: hola
nodes:
  intro:
    on-show: ['flag: conocio_mercader']
    text:
      - '¡Psst! Tú, el de los bolsillos vacíos. Acércate.'
      - 'Tengo cosas que no encontrarás en ningún otro lado. Pero nunca me quedo mucho...'
    next: hola
  hola:
    text: 'Mi mercancía cambia cada &flunes&f. Lo que ves hoy puede no estar mañana.'
    answers:
      - text: '&2Muéstrame tus productos'
        tooltip: '&7Abre el menú "shop" (DeluxeMenus).'
        actions: ['menu: shop']
      - text: '&7¿De dónde sacas todo esto?'
        goto: secreto
      - text: '&8No me interesa'
        goto: end
  secreto:
    text: 'Un buen mercader nunca revela a sus proveedores. &7&o*sonríe*'
    answers:
      - text: '&2Muéstrame tus productos'
        actions: ['menu: shop']
      - text: '&8Adiós'
        goto: end

Un encargo con entrega y misión

Un herrero que pide materiales, condicionado a una etapa activa de BeautyQuests, y que paga con afinidad y una recompensa.

name: '&6&lBrann el Herrero'
npcs: [brann]
portrait: 'npc | item:ANVIL'
start:
  - node: taller
nodes:
  taller:
    text: 'La forja lleva fría tres días. Me falta hierro.'
    layout: [1, 1]
    answers:
      - text: '&aEntregar 16 lingotes de hierro'
        icon: accept
        if: ['quest: active brann_hierro', 'has: IRON_INGOT 16']
        locked: '&7No tengo suficiente hierro, o ya no me hace falta.'
        actions:
          - 'take: IRON_INGOT 16'
          - 'give: EMERALD 4'
          - 'affinity: +3'
          - 'quest: complete brann_hierro'
        goto: gracias
      - text: '&7¿Qué necesitas exactamente?'
        icon: story
        goto: detalles
    nav:
      - back
      - exit
  detalles:
    text: 'Dieciséis lingotes de hierro. Nada más, nada menos.'
    answers:
      - text: '&7« Volver'
        goto: taller
  gracias:
    text: '¡Por fin! Con esto la forja vuelve a andar. Gracias, de verdad.'
# en la misión de BeautyQuests correspondiente
'1':
  stageType: ULTRADIALOGUE
  key: brann_hierro
  npc: brann
  customText: '§7Lleva §f16 lingotes de hierro §7a §fBrann'

Un guía con afinidad creciente

Basado en dialogues/kadir.yml, incluido con el plugin: un viajero que se abre según cuánto has hablado con él, con preguntas que rotan y un regalo de una sola vez.

name: '&6&lKadir'
npcs: [kadir]
portrait: 'npc | item:COMPASS'
affinity:
  min: 0
  max: 100
  cooldown-minutes: 30
  max-per-talk: 3
start:
  - if: 'affinity >= 50'
    node: amigo_cercano
  - if: 'affinity >= 25'
    node: amigo
  - if: 'affinity >= 10'
    node: conocido
  - node: desconocido
nodes:
  desconocido:
    variants:
      - '&7&o*te mira* &f¿Sí? ¿Qué quieres?'
      - 'No suelo hablar con desconocidos. Sé breve.'
    show: 2
    answers:
      - text: '&7Hola. ¿Quién eres?'
        actions: ['affinity: +2']
        goto: quien
      - text: '&7Lindo compás.'
        actions: ['affinity: +1']
        goto: compas
      - text: '&8Quítate de mi camino, viejo.'
        actions: ['affinity: -3']
        goto: ofendido
      - text: '&8Adiós.'
        always: true
        goto: end
  quien:
    text: 'Kadir. Cartógrafo, viajero... lo que haga falta para seguir caminando.'
    answers:
      - text: '&7« Seguir hablando'
        actions: ['dialogue: kadir']
  compas:
    text: '&7&o*lo guarda* &fNo apunta al norte. Apunta a lo que busco. No es asunto tuyo.'
    answers:
      - text: '&7« Seguir hablando'
        actions: ['dialogue: kadir']
  ofendido:
    text: '&7&o*frunce el ceño* &fLos modales no cuestan nada, ¿sabes?'
  amigo_cercano:
    answers:
      - text: '&dKadir, ¿tienes algo para mí?'
        if: '!flag:regalo_kadir'
        goto: regalo
      - text: '&8Nos vemos, hermano.'
        always: true
        goto: end
  regalo:
    text: 'Toma. Me acompañó en cada viaje. Ahora te toca cuidarla a ti.'
    on-show:
      - 'flag: regalo_kadir'
      - 'console: give %player% minecraft:recovery_compass 1'
      - 'sound: entity.player.levelup 0.8 1.2'
    answers:
      - text: '&7Gracias, Kadir. La cuidaré.'
        goto: end

Menú de varias páginas con el botón Volver siguiendo el historial de la conversación

Volver recuerda el camino recorrido dentro de la misma conversación, incluso si esta cruzó de un diálogo a otro.

Preguntas frecuentes

¿Necesito un resource pack para usar UltraDialogue? No, para la presentación básica no. Los botones y los íconos son texto plano por defecto. El resource pack solo es necesario si quieres los paneles RPG con fondo y marco de layout:; sin él, esos mismos botones se ven como [ texto ].

¿Funciona sin FancyNpcs? Sí. Puedes abrir un diálogo con /ud open, desde otro plugin, o etiquetar cualquier entidad con dialogue:<id>. FancyNpcs solo agrega la comodidad de vincularlo por clic.

¿Qué pasa si no tengo BeautyQuests instalado? El plugin carga igual. Las condiciones de misión (quest:) son siempre falsas, las acciones quest: start/force no hacen nada, y la consola lo avisa una vez por diálogo. quest: complete sigue disparando el evento DialogueSignalEvent aunque BeautyQuests no esté.

¿Cómo evito que un NPC repita el mismo saludo siempre? Con una marca (flag:) puesta en on-show la primera vez, y una regla de start que la revise; o con variants:, que elige una línea distinta cada vez.

¿Puedo tener diálogos distintos según qué tan bien me lleve con el personaje? Sí, es justo para eso que existe la afinidad: reglas de start con if: 'affinity >= N', y respuestas visibles solo a partir de cierto nivel.

Si edito un diálogo mientras hay jugadores hablando con ese NPC, ¿se rompe algo? No se rompe, pero tampoco se actualiza en caliente: /ud reload no cierra las conversaciones ya abiertas. Pide a esos jugadores que cierren y vuelvan a abrir la charla después de recargar.

¿Soporta Folia? No. plugin.yml lo declara explícitamente (folia-supported: false).

¿Y Bedrock/Geyser? No está verificado. El único respaldo probado es el de clientes Java viejos vía ViaVersion.

¿Puedo usar otro plugin de menús en vez de DeluxeMenus? Sí, cualquiera que acepte abrir un menú por comando de consola: cambia menu-command en config.yml.

¿Dónde se guardan las marcas y la afinidad? En el propio jugador (PersistentDataContainer), no en una base de datos aparte. No hay archivo que respaldar ni sincronizar entre servidores salvo que uses algo como un plugin de red de perfiles compartidos.

¿Qué pasa si give: no puede construir el ítem que le pido? Registra un aviso en consola (Cannot give '...') y no entrega nada; revisa que el formato sea un material válido, ultraboss:<id> o ultrarevive:<id> — los formatos pdc:, item_model: y name: sirven para identificar un ítem existente, pero no para fabricarlo desde cero.

Historial de versiones

1.1.3 — 2026-10-15

Un editor de botones en /ud, un resource pack mucho más chico y un código reorganizado. No cambia cómo se escriben los archivos de diálogo ni cómo se desarrollan las conversaciones.

  • Editor de botones en el juego: /ud (o /ud editor) abre un menú para elegir diálogo, nodo y editar cada botón — texto, ícono, tamaño y posición — sin tocar un editor de texto. Solo toca botones; el resto del nodo se edita en el archivo.
  • Resource pack mucho más chico: solo incluye el fondo liso y el borde doble; el jar bajó de ~570 KB a ~200 KB. Nombres de estilo o borde más viejos siguen cargando sin error, con un aviso de consola la primera vez.
  • Carpeta de datos propia: plugins/UltraDialogue/ en vez de la compartida plugins/UltraView/UltraDialogue/. La migración es automática y se anuncia una sola vez.
  • Código reorganizado en paquetes (command, config, migration, model, registry, gui, listener, pack, hook, util) y traducido íntegramente al inglés (los archivos de diálogo siguen aceptando claves en español, como siempre). Build con Gradle (Kotlin DSL) además de compilar.sh.

1.1.2

Filas libres, un tema limpio de marco doble, símbolos de misión y mejor navegación. Objetivo de servidor: Paper 26.1.2 con Java 25.

  • layout: / filas: por nodo, para disposiciones como [1, 2, 2, 1] o [3, 1]; filas de 1 a 6 botones, dibujadas como texto clicable en el cuerpo del diálogo. nav: pasa a ser una fila de botones reales.
  • Paneles RPG simples: fondo oscuro liso y marco doble por defecto (style: liso, border: doble, look: filled); el color del marco sigue el ícono de cada botón. border-colors permite personalizar la paleta.
  • Diez presets de ícono de texto reemplazan los 20 sprites de pixel art de la 1.1.1 (heart, gem, gift, star, shop...), que quedan sin efecto.
  • locked:, Volver con historial entre diálogos, Salir fijo al pie, y title: por nodo.

1.1.1 — 2026-09-26

  • Tamaños de botón size: 1 a 4 (20/98/150/204 px) o width: N exacto; columns: por nodo; una respuesta puede tener solo ícono, sin texto.
  • 20 íconos de pixel art (reemplazados en la 1.1.2), servidos por el plugin en el puerto 8083, con respaldo de texto para quien no cargó el pack.
  • Rostro 2D del NPC junto a su nombre, en lugar de la cabeza 3D en silueta oscura de antes.
  • Entregas: condiciones has:/hand: y acciones take:/give:; take: todo o nada, revisado de nuevo al hacer clic.
  • Misiones y bloqueos de historia: condiciones quest: completed/started/active, acciones quest: complete/start/force, el tipo de etapa ULTRADIALOGUE de BeautyQuests (opcional) y el evento DialogueSignalEvent.
  • Placeholders %ultradialogue_affinity_<id>% y %ultradialogue_flag_<marca>%.
  • Claves en español: icono, tamaño/tamano, ancho, columnas, tiene, mano, quitar, dar, mision (completada, en-curso, activa, completar, empezar, forzar).

1.1 — 2026-09-26

  • Afinidad: nivel de amistad oculto por jugador y por personaje, con anti-farmeo (enfriamiento de 30 minutos y máximo de 3 puntos por charla, ambos configurables), gestionable con /ud affinity.
  • variants: y show: N para conversaciones que no se repiten siempre igual; always: true para sacar una respuesta de esa rotación.
  • Nuevo ejemplo kadir.yml. Claves en español: afinidad, variantes, mostrar, siempre, cooldown-minutos, max-por-charla.

1.0 — 2026-09-25

Primer lanzamiento público, para Minecraft 26.1.2. Nació como un plugin privado llamado "Dialogos", hecho para un único servidor.

  • Pantallas de diálogo nativas (1.21.6+): retrato, texto y respuestas como botones. Sin resource pack, sin mod de cliente.
  • Conversaciones ramificadas en YAML: nodos, respuestas, next, reglas de start.
  • 13 acciones: goto, dialogue, menu, command, console, message, broadcast, actionbar, title, sound, flag, unflag, close.
  • Condiciones de permisos, marcas y comparaciones de PlaceholderAPI.
  • Marcas por jugador (PersistentDataContainer), retratos con alternativas, soporte de FancyNpcs, etiquetas de entidad, respaldo de chat para clientes viejos (ViaVersion), inglés y español.
  • Cambios frente al plugin privado: renombrado de "Dialogos" a UltraDialogue (comando /ud, permiso ultradialogue.admin, paquete mc.gupe.ultradialogue); migración automática de plugins/Dialogos/dialogos/ la primera vez que arranca.

Enlaces