A modern, high-performance, object-oriented GUI framework for Minecraft Forge 1.12.2.
Tired of dealing with hardcoded coordinates, messy drawScreen overrides, and infinite bugs in the archaic Vanilla Minecraft 1.12.2 GUI system?
X4UI is a standalone, flexible, and dynamic user interface framework extracted from Hammers Unbound. It brings modern web-like development paradigms (like FlexBox layouts, DOM-tree structures, and event bubbling) straight into Forge 1.12.2.
You should use X4UI if you are building:
GuiMarkdown parser that automatically converts Markdown text into beautiful, structured UI elements (Headers, blockquotes, bullets, and images).GuiScrollPanel provides out-of-the-box OpenGL clipping (GL_SCISSOR_TEST), allowing you to create smooth, scrollable lists of ingredients without items rendering outside the box. Nested scroll panels automatically intersect their scissor boxes using ScissorHelper.rootPanel.addChild(new GuiButton(...))).GuiPanel supports automatic VERTICAL and HORIZONTAL stacking with gaps and margins. No more manual math for UI placement!FontWidthCache system ensures complex text parsing (like Markdown) won't cause memory leaks by limiting cached strings using an automatic LRU eviction policy.Add the following to your build.gradle:
repositories {
maven { url 'https://cursemaven.com' }
}
dependencies {
// Replace file_id with the appropriate version file ID from CurseForge
compile 'curse.maven:x4ui-1656104:file_id'
}
To use X4UI, simply extend GuiBaseScreen instead of Vanilla's GuiScreen:
public class MyCustomScreen extends GuiBaseScreen {
public MyCustomScreen() {
super(null, "My Title");
}
@Override
protected void initComponents() {
// rootPanel is automatically created by GuiBaseScreen
rootPanel.setFlexDirection(FlexDirection.VERTICAL);
rootPanel.setGap(5);
GuiLabel titleLabel = new GuiLabel(0, 0, "HELLO X4UI!");
GuiButton closeButton = new GuiButton(0, 0, 100, 20, "Close", () -> this.closeScreen());
rootPanel.addChild(titleLabel);
rootPanel.addChild(closeButton);
}
}
¿Cansado de lidiar con coordenadas estáticas (hardcodeadas), sobreescrituras desordenadas de drawScreen e infinitos bugs en el arcaico sistema de interfaces de Vanilla Minecraft 1.12.2?
X4UI es un framework de interfaces de usuario dinámico, flexible e independiente, extraído del mod Hammers Unbound. Trae consigo los paradigmas de desarrollo web modernos (como diseños FlexBox, estructuras en árbol DOM y propagación de eventos) directamente a Forge 1.12.2.
Deberías considerar usar X4UI si estás creando:
GuiMarkdown que convierte automáticamente texto en elementos de UI estructurados y hermosos (Encabezados, citas, viñetas e imágenes).GuiScrollPanel proporciona recorte OpenGL nativo (GL_SCISSOR_TEST), permitiéndote crear listas de ingredientes desplazables y suaves sin que los ítems se rendericen fuera de la caja. Los paneles anidados calcularán sus áreas de recorte perfectamente gracias a ScissorHelper.rootPanel.addChild(new GuiButton(...))).GuiPanel soporta apilamiento automático VERTICAL y HORIZONTAL con márgenes y separaciones. ¡Se acabó calcular matemáticas manuales para posicionar interfaces!FontWidthCache asegura que el análisis de textos complejos (como Markdown) no cause fugas de memoria al limitar las cadenas cacheadas usando una política de limpieza automática LRU.Añade lo siguiente a tu build.gradle:
repositories {
maven { url 'https://cursemaven.com' }
}
dependencies {
// Reemplaza file_id con el ID de archivo de la versión correspondiente en CurseForge
compile 'curse.maven:x4ui-1656104:file_id'
}
Para usar X4UI, simplemente extiende GuiBaseScreen en lugar del clásico GuiScreen de Vanilla:
public class MyCustomScreen extends GuiBaseScreen {
public MyCustomScreen() {
super(null, "Mi Título");
}
@Override
protected void initComponents() {
// rootPanel es creado automáticamente por GuiBaseScreen
rootPanel.setFlexDirection(FlexDirection.VERTICAL);
rootPanel.setGap(5);
GuiLabel titleLabel = new GuiLabel(0, 0, "¡HOLA X4UI!");
GuiButton closeButton = new GuiButton(0, 0, 100, 20, "Cerrar", () -> this.closeScreen());
rootPanel.addChild(titleLabel);
rootPanel.addChild(closeButton);
}
}