I'm sorry, but "UIWeaver" appears to be an English term or phrase. Could you please provide a game t

I'm sorry, but "UIWeaver" appears to be an English term or phrase. Could you please provide a game t

实验性UI框架

基础库

UIWeaver

UIWeaver 是一个实验性的 Minecraft UI 框架,旨在通过可复用的布局组件来构建模组屏幕,而非手动定位每个控件。

目前仍处于原型阶段。当前的主要目标是让屏幕结构更容易组织、与服务器保持同步,并在出现布局错误时便于调试。


为何存在

Minecraft 屏幕很容易变得混乱。大量 UI 代码最终混合了渲染、槽位定位、按钮处理、同步数据包、提示文本以及硬编码坐标。

对于小型菜单来说这还能应付,但当屏幕包含标签页、库存、进度条、服务器操作或可调整大小的布局时,就会变得很棘手。

UIWeaver 试图通过将屏幕描述为组件树来让此流程更可靠:

ui.column()
    .padding(8)
    .gap(6)
    .add(ui.label(Component.literal("Machine Dashboard")))
    .add(ui.row()
        .gap(4)
        .add(ui.button(Component.literal("Start")).action("start"))
        .add(ui.button(Component.literal("Stop")).action("stop"))
    )
    .add(ui.progressBar().bind("progress"));

布局会自动决定每个子组件的位置,无需手动计算每个 x 和 y 坐标。


组件

UIWeaver 包含了构建常见 Minecraft 模组屏幕所需的基本构建块:

  • column(列)
  • row(行)
  • grid(网格)
  • tabs(标签页)
  • scrollPanel(滚动面板)
  • label(标签)
  • button(按钮)
  • toggle(开关)
  • checkbox(复选框)
  • slider(滑块)
  • textInput(文本输入框)
  • progressBar(进度条)
  • energyBar(能量条)
  • fluidBar(流体条)
  • slotGrid(槽位网格)

目标不是完全隐藏 Minecraft 的 UI 系统。槽位、提示文本、GUI 缩放和服务器验证仍然重要。UIWeaver 旨在让这些部分更容易组织。


布局

容器负责处理间距和子控件放置:

ui.column().padding(8).gap(4)
ui.row().gap(8).fillWidth()
ui.grid(3, 3)

这能让大部分屏幕避免变成一长串手动计算的坐标。


服务器操作

按钮可以向服务器发送命名操作:

ui.button(Component.literal("Start"))
    .id("btnStart")
    .action("start");

服务器决定操作实际执行的内容以及是否允许执行。这避免了将机器逻辑或受信任的状态更改放在客户端。


同步状态

屏幕可以从 UIViewModel 读取值:

energy = 100
maxEnergy = 10000
working = false
progress = 42

进度条、标签、开关和其他控件可以使用这些值进行显示,而无需每个控件单独处理数据包。


调试工具

UIWeaver 拥有用于解决布局问题的调试覆盖层和检查器。

在以下情况时非常有用:

  • 组件超出其父容器范围
  • 非活跃标签页仍在被检查
  • 重新布局后子组件边界未更新
  • 槽位视觉效果与真实的 Minecraft Slot 位置不匹配
  • 面板被裁剪或位置过高

覆盖层可以绘制可见的组件边界,而检查器可以显示类型、ID、大小、位置、可见性和同步值。


示例

一个基本的机器屏幕可以这样编写:

.root(ui.column().padding(10).gap(8).size(530, 340)

    .add(ui.row().gap(8).fillWidth().height(28)
        .add(ui.column().gap(2).grow().height(28)
            .add(ui.label(Component.literal("UIWeaver Reactor"))
                .id("title"))
            .add(ui.label(Component.literal("Server driven test machine"))
                .id("subtitle"))
        )
        .add(ui.button(Component.literal("Start"))
            .id("btnStart")
            .action("start")
            .size(54, 20))
        .add(ui.button(Component.literal("Stop"))
            .id("btnStop")
            .action("stop")
            .size(54, 20))
    )

    .add(ui.row().gap(8).fillWidth().height(58)
        .add(ui.energyBar()
            .id("energyBar")
            .bind("energy", "maxEnergy")
            .size(12, 54))

        .add(ui.column().gap(5).grow().height(58)
            .add(ui.label(Component.literal("Main cycle")))
            .add(ui.progressBar()
                .id("mainProgress")
                .fillWidth()
                .height(12))
        )

        .add(ui.fluidBar()
            .id("fluidReserve")
            .size(12, 54))
    )

    .add(ui.tabs().id("mainTabs").fillWidth().grow()
        .tab("Main", ui.column().padding(8).gap(6)
            .add(ui.label(Component.literal("Machine State")))
            .add(ui.toggle().id("statusToggle"))
        )

        .tab("Inv", ui.column().padding(8).gap(6)
            .add(ui.slotGrid(3, 3)
                .id("slots")
                .bind("machineInv"))
        )

        .tab("Tune", ui.column().padding(8).gap(7)
            .add(ui.slider(0, 100)
                .id("speedSlider")
                .value(40))
            .add(ui.button(Component.literal("Apply tuning"))
                .id("applyTuning"))
        )
    )
)

当前特性

  • 组件树屏幕定义
  • 行、列、网格、标签页和滚动面板
  • 标签、按钮、开关、复选框、滑块和文本输入框
  • 进度条、能量条和流体条
  • 基本的库存槽位网格
  • 同步的 ViewModel 值
  • 命名服务器操作
  • Forge 客户端渲染器集成
  • 组件边界覆盖层
  • UI 检查器(用于布局和状态调试)

当前限制

UIWeaver 仍处于早期阶段,因此某些部分尚不稳定。

槽位放置

渲染的槽位网格和真实的 Minecraft Slot 对象必须完全对齐。这是在框架用于更大规模库存前需要稳定化的最重要事项之一。

标签页

只有活跃的标签页应该渲染、接收输入并出现在常规检查中。非活跃标签页的内容需要更严格的处理,以免意外影响可见布局。

样式

样式系统仍然基础。面板、边框、悬停状态、激活状态、间距预设和可复用的主题已规划但尚未完成。


发展方向

长期目标是让 Minecraft 模组屏幕更容易构建,同时不失去对关键部分的控制。

UIWeaver 应帮助实现:

  • 从更小的部分构建屏幕
  • 尽可能避免硬编码的像素计算
  • 保持客户端交互经过服务器验证
  • 使布局错误更容易被发现
  • 支持 Minecraft 特定的 UI 需求,如槽位、提示文本、GUI 缩放和同步数据

路线图

未来可能的工作:

  • 样式和主题 API
  • 可复用的面板/卡片组件
  • 更强大的槽位绑定
  • 标签感知的布局传递
  • 动画支持
  • 提示文本辅助工具
  • 经过验证的表单输入
  • 屏幕编辑器
  • 拖放布局调试
  • 可复用的屏幕模板
  • Fabric 支持
  • NeoForge 支持

项目状态

UIWeaver 是一个原型。它已经证明了基本方法:屏幕可以由包含布局、同步值、操作和调试工具的组件树构建。

接下来的重点是使标签页和库存槽位可靠,然后改进样式,使屏幕不仅功能完善,而且外观精良。


社区

加入 UIWeaver Discord 服务器进行讨论、反馈、开发更新和支持。

Discord


许可证

UIWeaver 采用 GNU Lesser General Public License v3.0 许可。

您可以在自己的模组中将 UIWeaver 作为库使用,包括闭源或商业项目,前提是对 UIWeaver 本身所做的修改保持 LGPL-3.0 许可证的可用性。

完整许可证文本见 LICENSE 文件。