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.ymlnunca 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
softdependenplugin.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
- Suelta el
.jarenplugins/y arranca el servidor. Al iniciar por primera vez se crean tres diálogos de ejemplo (example.yml,merchant.ymlykadir.yml). - 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 compartidaplugins/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). Tuconfig.ymly tus diálogos nunca se sobrescriben en una actualización. - 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. - 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 reloadno 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.
Tu primer diálogo
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 |
Navegación (nav)
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
backrecorre 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).exitva en el pie de la pantalla. Minecraft solo tiene espacio para un botón fijo ahí;backy el resto denavocupan 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}

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 descreen.layout.button-formatdeconfig.yml. Con el pack cargado (ybuttons: autoopack), 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 denav:sí, porque es nativa.

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 propioif.show: Nmuestra soloNde las respuestas del nodo (de entre las que no tienenalways: true), elegidas al azar en cada visita. Útil para que un NPC no suelte siempre las mismas cinco preguntas en el mismo orden.always: truesaca 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áximomax-per-talkpuntos (3) por conversación. Perder afinidad no tiene límite. - Los valores por defecto viven en
config.yml, bajoaffinity:; cada diálogo puede traer su propia secciónaffinity: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,50como$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.

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 mensajeitem-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
startpuede 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:
- FancyNpcs. Pon el nombre interno del NPC (el que usaste en
/npc create, no el de display) en la listanpcs:del diálogo. Al hacer clic derecho (o izquierdo, sileft-click: trueenconfig.yml) se abre la conversación en lugar de las acciones propias de FancyNpcs.npcs.ymlnunca se modifica: quitar el NPC de esa lista lo devuelve a su comportamiento normal. - Cualquier entidad, con una etiqueta.
/tag @e[type=villager,limit=1,sort=nearest] add dialogue:merchant(la etiqueta antiguadialogo:también funciona). Sirve para aldeanos, armor stands o cualquier entidad que no venga de FancyNpcs. - El comando
/ud open. Funciona desde la consola o como acción de otro plugin, y no requiere que haya ningún NPC cerca. - 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
cancelarpara 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, susactionsy 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.

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.

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

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
lisoy el bordedoble; 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 compartidaplugins/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 decompilar.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-colorspermite 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, ytitle:por nodo.
1.1.1 — 2026-09-26
- Tamaños de botón
size: 1a4(20/98/150/204 px) owidth: Nexacto;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 accionestake:/give:;take:todo o nada, revisado de nuevo al hacer clic. - Misiones y bloqueos de historia: condiciones
quest: completed/started/active, accionesquest: complete/start/force, el tipo de etapaULTRADIALOGUEde BeautyQuests (opcional) y el eventoDialogueSignalEvent. - 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:yshow: Npara conversaciones que no se repiten siempre igual;always: truepara 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 destart. - 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, permisoultradialogue.admin, paquetemc.gupe.ultradialogue); migración automática deplugins/Dialogos/dialogos/la primera vez que arranca.
Enlaces
- Modrinth: modrinth.com/plugin/ultra-dialogue
- Código fuente (GitHub): github.com/GupeLegend/UltraDialogue
- Licencia: MIT © 2026 Social Studio