Saltar al contenido principal

UiCore

Menús, HUD, diálogos, minimapa y placas de nombre dibujados en el espacio GUI con un shader, sin mod de cliente.

Privadasv0.1.0-alphaMenús y visuales
RequiereTypeWriter0.9.0-beta-177 (BTC build)CraftEnginePacketEventsEntityQuestBTCMobsGUIopcionalCodexopcionalBattlePassopcionalTinyEssentialsopcionalCosmeticsopcionalPartyopcional

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

Descripción general​

UiCore dibuja menús, tarjetas, un HUD, diálogos, un minimapa y un mapa del mundo en el espacio de GUI del cliente vanilla, sin ningún mod en el cliente. Lo consigue con un shader de núcleo (text.vsh) incluido en el resource pack: todo lo que se dibuja es un glifo de fuente, y el shader lee el ascent y el color del glifo para saber dónde colocarlo en una cuadrícula fija de 15 por 15. El resultado es idéntico para todos los jugadores, sea cual sea su escala de GUI, su campo de visión o el tamaño de su ventana, y puede aparecer en cualquier lugar de la pantalla en lugar de solo donde se abre un inventario.

UiCore sustituye a dos herramientas más antiguas: AdvancedMenus (menús de cofre) y BetterHud. Un menú ya no es un inventario de cofre: es una vista, una pila de capas de componentes que creas en el panel web y a la que el jugador apunta con la cabeza. La misma cuadrícula dibuja los módulos del HUD, las líneas de diálogo y las opciones.

La carpeta de código fuente de esta extensión lleva el nombre de la antigua extensión de HUD; el nombre de la extensión es UiCore. Se ejecuta en la versión BTC de TypeWriter, necesita CraftEngine para alojar el resource pack y está marcada como alfa (0.1.0-alpha).

Características​

  • Vistas: pantallas completas con paneles, botones, listas, pestañas, subpantallas, tooltips, indicadores y entrada de texto.
  • Estados y animaciones: los componentes cambian con hechos o permisos, y una vista puede aparecer con un barrido, un florecimiento o un fundido.
  • Módulos de HUD: elementos permanentes anclados a una esquina o al centro, ocultos mientras el jugador lee otra pantalla.
  • Diálogos: líneas habladas y opciones que se responden con la rueda del ratón o con el cursor, con una única entrada de estilo compartida.
  • Diálogo cinemático: la misma línea hablada en una línea de tiempo de cinemática.
  • Minimapa y mapa del mundo: mapa del terreno con puntos de interés, waypoints y un modo de exploración.
  • Placas de nombre: placas de nombre 3D para mobs y jugadores, con banners, insignias de nivel e indicadores de estado de NPC.
  • Banners y control del chat: un anuncio de una línea en la parte superior de la pantalla y una acción para silenciar el chat en un lugar.
  • Disparadores por objeto: abre una vista al hacer clic derecho con un material.
  • Integraciones: muestra datos de misiones, codex, pase de batalla, cosméticos, mascotas, funciones sociales, wiki y RPG Core cuando esas extensiones están presentes.

Instalación​

  1. Instala CraftEngine: aloja el resource pack que contiene el shader, las fuentes y las imágenes. Instala PacketEvents si tu compilación no lo proporciona ya; se usa para suprimir el chat y para la rueda del ratón y las teclas de movimiento.
  2. Instala las extensiones Entity y Quest de TypeWriter y la extensión BTCMobs: son dependencias declaradas.
  3. Opcionalmente, instala las extensiones de las que UiCore puede leer: Ghost, Codex, BattlePass, TinyEssentials, Cosmetics, NumericalStorage, Permissions, Pets, Friend, Party y Guild. La extensión GUI también es opcional: cuando está presente, UiCore lee los estados de menú que publica.
  4. Coloca el JAR de UiCore en plugins/Typewriter/extensions/ y reinicia el servidor.
  5. Despliega el fragmento de resource pack de UiCore en el pack de CraftEngine. El pack lo genera la propia herramienta de la extensión (generate-gui-pack y después validate-gui-pack) y debe desplegarse antes del JAR que le corresponde; de lo contrario, todos los iconos de objetos se desplazan una posición sin ningún error.
Identificadores del resource pack

Un identificador de recurso de Minecraft solo admite [a-z0-9._-/]. Un proveedor de fuente con cualquier otro carácter lo rechaza el cliente en silencio, y el glifo aparece como un rectángulo negro en la parte superior de la pantalla. El generador del pack se niega a escribir una ruta así.

Primeros pasos​

Abre un pequeño menú desde una brújula.

  1. En el panel web de TypeWriter, abre una página estática y añade una entrada UI View. Establece viewId en hello_menu.
  2. Añade una capa (layerId main) y un primer componente: placement.kind CELL, column 4, row 6, width 7, height 3, palette SURFACE, hoverPalette BLUE_LIGHT, text Hello, tooltip Click me.
  3. En onLeftClick, enlaza una acción como un comando o un mensaje. Añade un segundo componente con navigateTo o Close UI View para salir.
  4. Añade una acción Open UI View con viewId hello_menu, o asocia un objeto: añade un UI Item Trigger con material COMPASS y viewId hello_menu.
  5. Publica. Haz clic derecho en una brújula: aparece la pantalla; apunta al botón con la cabeza y haz clic.

Cómo funciona​

Una vista es una lista de capas (de atrás hacia delante); una capa contiene componentes; un componente indica dónde se sitúa, cómo se pinta, qué muestra y qué activa un clic. Tres límites proceden de la codificación, no del código:

  • Un tinte es un índice. El color de una celda lleva su columna, su fila y el índice de paleta, por lo que los tintes proceden de una paleta con nombre fija (SURFACE, BLUE_LIGHT, GOLD...), no de valores hexadecimales libres.
  • Las imágenes son baratas, las fuentes son escasas. Un componente se puede pintar con una imagen de panel; cualquier número de imágenes comparte una fuente. El tinte del texto procede de la fuente, y el pack incluye 16 tintes de texto, por lo que un 17.º vuelve al blanco.
  • Nada se desliza y el texto no se desvanece. Una animación revela las celdas en un orden. El texto llega con su panel.

Las vistas abiertas se niegan a iniciarse mientras el jugador está cayendo (el jugador recibe un mensaje). Una cadena de renderizadores (rendererOrder de UI Configuration) decide qué renderizador sirve una vista: GUI (este shader), DIALOG, SPATIAL o CHEST.

Menús​

Apertura​

Una vista se puede abrir mediante:

  • la acción Open UI View (viewId);
  • el comando /ui open <viewId> de una entrada UI View Commands;
  • un UI Item Trigger, que abre una vista cuando el jugador hace clic derecho con un material determinado (si dos vistas reclaman el mismo material se registra una advertencia y solo se abre la última);
  • el openMaterial del minimapa, que abre el mapa del mundo.

Close UI View o /ui close la cierran.

Layout y componentes​

La cuadrícula es de 15 columnas por 15 filas para los menús. placement.kind es CELL (una celda de la cuadrícula: column, row, width, height), MARKER (una posición de 0 a 1 a lo largo del viewport, x e y, limitada) o SCRIM (un velo a pantalla completa). Un botón necesita varias celdas para que sea fácil apuntarle.

Campo del componenteEfecto
palette, hoverPalette, disabledPaletteTinte en reposo, bajo el cursor y mientras los criteria no se cumplen.
backgroundUna imagen de panel del pack (nueve porciones) en lugar de un tinte plano; backgroundBinding elige la imagen a partir de un placeholder.
text, textPalette, textAlign, textEffectTexto dibujado a lo ancho del componente.
icon, lineIconLa imagen de un material dibujada delante del texto o cerrando la línea.
image, imageBindingUna imagen del pack ajustada dentro del componente conservando su relación de aspecto.
label, tooltipTexto que se muestra junto a la pantalla, o en el ancla del tooltip, mientras el cursor reposa sobre el componente.
gaugeDibuja una barra a partir de un placeholder que contiene de 0 a 100 (por ejemplo btcui_health_percent).
bindingUn placeholder del que el componente toma su valor.
criteria, onLeftClick, onRightClickCondiciones para hacer clic y las entradas que se activan.
navigateToAbre otra pantalla de la misma vista.
inputPide al jugador que escriba un valor; onInputCommands se ejecuta desde la consola con {input} y %player% sustituidos.

Pantallas, listas y estados​

  • Nodos (nodes, rootNodeId) declaran pestañas y subpantallas, cada una eligiendo qué capa rellena qué región con nombre. Los títulos alimentan la ruta de navegación.
  • Repeticiones (repeats en una capa) dibujan una ventana sobre fuentes numeradas: el elemento n lee el binding <source>.<n>. stepMode PAGE gira una ventana completa por gesto, ITEM avanza de uno en uno.
  • Estados (states) cambian componentes mientras se cumple una condición: un tinte, un texto, un tooltip, un icono, un panel o la visibilidad. El estado de mayor prioridad cuyas condiciones se cumplen es el activo, un estado puede refinar un parentId, y un componente se direcciona por id o por column:row. Los estados se reevalúan en cada repintado.
  • Llegada (opening, openingMillis, openingFade): WIPE_DOWN, WIPE_UP, WIPE_RIGHT, WIPE_LEFT, BLOOM o FADE. Solo se reproduce al entrar en la interfaz, no entre dos pantallas.

Paleta​

FRAME, SURFACE, SURFACE_LIGHT, MUTED, BLUE, BLUE_LIGHT, CYAN, TEAL, GREEN, GREEN_LIGHT, YELLOW, ORANGE, RED_DARK, RED, PURPLE, WHITE, BLACK, INK, SLATE, STEEL, STEEL_LIGHT, MIST, PAPER, FOREST, MINT, GOLD, AMBER, WINE, CORAL, VIOLET. NONE no dibuja nada.

Interacción​

El cursor sigue la cabeza del jugador: el yaw y el pitch se proyectan sobre la cuadrícula y se ajustan a una celda. Los jugadores cambian su velocidad con /ui sensitivity <degrees>: un ángulo mayor significa un cursor más lento.

  • El clic izquierdo y el derecho activan onLeftClick y onRightClick; la rueda del ratón desplaza listas y pestañas; agacharse es un atajo que cierra la vista (salvo mientras una lista de árbol de investigación tiene el foco).
  • La vista cede ante el mundo: alejarse, un teletransporte, recibir daño o abrir un inventario la cierran.
  • Mientras una vista está abierta, el chat de los demás jugadores se mantiene fuera de la pantalla, y los mensajes del servidor se vuelven a dibujar con el chat de la UI en lugar del chat vanilla.

Módulos de HUD​

Las entradas UI HUD usan las mismas capas y componentes que una vista, ancladas a una corner (TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, CENTRE); los desfases se cuentan hacia dentro desde ella. priority decide cuál de dos grupos superpuestos se dibuja encima y visibility condiciona el grupo. Los módulos de HUD se suspenden automáticamente mientras una vista, un diálogo, una cinemática o el mapa del mundo ocupan la pantalla.

Diálogos​

UI Spoken Dialogue muestra una línea con el nombre del hablante, un portrait opcional, una duration de escritura (cero la muestra de golpe) y un sound. UI Option Dialogue añade opciones (options): navigation es KEYS (rueda del ratón y tecla de confirmación), CURSOR o ambas (el valor por defecto); un timer cancela el diálogo y dispara cancelTriggers; cada opción tiene criteria (se dibuja bloqueada, u oculta con hideWhenLocked), un lockedReason que se muestra en lugar de su tooltip mientras está bloqueada, modifiers y triggers. Ambas admiten una entrada style; déjala vacía para usar la del propio servidor.

UI Dialogue Style define el aspecto en celdas de la cuadrícula: speech (marco, área de texto, banner del hablante, retrato), options (ventana, panel, tintes para las opciones seleccionadas y bloqueadas, cursor y flechas de desplazamiento, segunda columna opcional) y chrome (imagen de la tecla de confirmación, fila de cuenta atrás, filas de letterbox). UI Spoken Cinematic coloca líneas en una página de cinemática con segmentos startFrame y endFrame.

Mapas y placas de nombre​

El minimapa permanente se configura con Minimap Settings (worlds y excludeListedWorlds, size, blocksPerCell, borderThickness, openMaterial, maxWaypoints, worldMapAreas) y sus puntos con Minimap Points of Interest. Su posición en la pantalla se define en el resource pack, no aquí, porque el servidor no conoce ni la resolución ni la escala de GUI. El mapa del mundo se abre haciendo clic derecho con openMaterial o con /worldmap; el juego normal lo rellena con lo que lee el minimapa, y el modo de exploración cartografía un radio mayor de forma deliberada.

Las placas de nombre son tridimensionales y por espectador. Global Nameplate dibuja líneas sobre los mobs (entityTypes, btcMobsOnly, lines, viewDistance, requireLineOfSight...). Player Nameplate Banner define fondos de banner seleccionables (un prefijo de imagen de CraftEngine con las porciones _left, _middle y _right), y la elección del jugador se almacena en un artefacto de selección. Nameplate Settings establece las distancias, los presupuestos y la unidad de salud; Level Badge Settings establece la palabra que se escribe antes de un nivel (prefijo por defecto, puede ser un placeholder de traducción). NPC Status Override coloca un modelo indicador (disponible, activo, interacción...) sobre un NPC.

Comandos​

ComandoDescripción
/ui open <viewId>Abre una vista.
/ui closeCierra la vista abierta.
/ui sensitivity [degrees]Muestra o establece el barrido de tu cursor en grados.
/ui icons [materials]Imprime iconos de objetos en el chat para comprobar la fuente de sprites.
/ui chat vanillaSolo operadores: te devuelve el chat vanilla hasta que te desconectes o lo vuelvas a ejecutar.
/worldmapAbre o cierra el mapa del mundo.
/worldmap survey, forget, stats, minimap, waypoint <name>, waypoint clear, save, debugModo de exploración, olvidar tu mapa, mostrar su tamaño, alternar el minimapa, renombrar o borrar waypoints, guardar e imprimir un diagnóstico.
/nameplates (alias /nameplate, /btcnameplates)equip <id>, unequip, preview [id], list, toggle [on|off] y las formas de administración force-equip, force-unequip, force-preview, admin-toggle.

Los nombres de /ui y /worldmap proceden de los campos commandName de sus entradas. Su campo permission es un nodo de permiso que eliges tú: vacío significa todos. /worldmap survey, forget, save y el interruptor de exploración usan surveyPermission.

Permisos​

PermisoConcede
permission de UI View CommandsLos subcomandos de /ui (vacío: todos).
permission y surveyPermission de World Map Command/worldmap, y exploración y olvido (vacío: todos).
btcnameplates.command.equip, .unequip, .preview, .list, .toggleLos subcomandos de /nameplates correspondientes para los jugadores.
btcnameplates.command.admin.force_equip, .force_unequip, .force_preview, .toggleLos subcomandos de administración de /nameplates.
visibility.permission en componentes y gruposMuestra u oculta un elemento a los jugadores que no tienen el nodo.

Placeholders​

Expansión de MiniPlaceholders btcui, para componentes, indicadores y texto.

PlaceholderDevuelve
<btcui_level_glyph:37>Cualquier número escrito con los dígitos de nivel de colores del pack.
<btcui_global_level_glyph>, <btcui_global_level>, <btcui_global_level_badge>El nivel global como glifos, como dígitos o con el prefijo configurado.
<btcui_global_percent>, <btcui_global_detail>, <btcui_xp_detail>El progreso hacia el siguiente nivel global y sus números.
<btcui_health>, <btcui_health_max>, <btcui_health_percent>, <btcui_absorption>Salud y absorción.
<btcui_food>, <btcui_food_max>, <btcui_food_percent>, <btcui_saturation>Hambre.
<btcui_air>, <btcui_air_max>, <btcui_air_percent>, <btcui_air_gauge>Reserva de aire; el indicador está vacío mientras al jugador no le falta aire.
<btcui_xp_level>, <btcui_xp_progress>, <btcui_xp_percent>La barra de experiencia vanilla (usada para encantar).
<btcui_riding>, <btcui_mount_name>, <btcui_mount_health>, <btcui_mount_health_max>, <btcui_mount_health_percent>, <btcui_mount_gauge>La montura.
<btcui_underwater>, <btcui_swimming>, <btcui_burning>, <btcui_freezing>Estados del jugador.
<btcui_x>, <btcui_y>, <btcui_z>, <btcui_world_time>, <btcui_world_day>Posición y hora.
<btcui_banner>, <btcui_actionbar>, <btcui_chat:...>Banner actual, barra de acción y líneas de chat dibujadas por la UI.

Entradas​

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

Acciones5
Audiencias2
Diálogos2
Cinemáticas1
Datos de entidad1
Comandos2
Artefactos1
Manifiestos12

Resolución de problemas​

Rectángulos negros o cuadrados vacíos (tofu) donde deberían estar el texto y las celdas. Falta el fragmento de resource pack, está desactualizado o se desplegó después del JAR, o una ruta de fuente contiene un carácter fuera de [a-z0-9._-/]. Vuelve a desplegar primero el pack y después el JAR que le corresponde, y comprueba que CraftEngine lo ha recargado.

Los iconos de objetos muestran un objeto equivocado. El pack y el JAR no coinciden: el carácter de un icono es su posición en la tabla, por lo que un pack generado después del JAR desplaza todos los iconos. Regenera y valida el pack y vuelve a desplegar ambos.

Un objeto abre un menú vacío. Dos asociaciones UI Item Trigger reclaman el mismo material; el registro dice est reclame par ... con el número de componentes de cada una. Elimina la asociación sobrante.

names view '<id>', which no page defines. El viewId dado a la acción, al comando o al objeto no coincide con ninguna UI View publicada. Una vista que está declared but incomplete no tiene ninguna capa ni componente que se pueda resolver.

El menú no se abre en el aire. UiCore se niega a abrir una pantalla mientras el jugador está cayendo. Inténtalo de nuevo en el suelo.

El chat ha desaparecido. UiCore dibuja el chat por sí mismo: hay una vista abierta, un Mute UI Chat está activo o el jugador lo desactivó. Usa Unmute UI Chat al salir del lugar donde lo silenciaste; los operadores pueden usar /ui chat vanilla para comprobar el chat vanilla.

Los gestos dejan de funcionar. Gesture decoding unavailable en el registro significa que PacketEvents no pudo arrancar: se pierden la rueda del ratón y las teclas de movimiento, pero los clics siguen funcionando.

Extensiones relacionadas​