HtmlCraft API

HtmlCraft API

一个HTML/CSS渲染引擎,为Minecraft GUI提供基于Web的界面构建能力。

创建

HtmlCraft API

适用于 Minecraft 1.20.1 Forge / Fabric 及 26.2 Fabric 的 HTML/CSS GUI 渲染引擎

介绍

HtmlCraft API 是一个轻量级 HTML/CSS 渲染引擎,将 Web 前端技术引入 Minecraft GUI 开发。开发者无需学习复杂的 Minecraft GUI API(GuiGraphics、Widget、AbstractContainerScreen 等),只需编写 HTML + CSS 即可构建精美的游戏界面。


功能特性

功能 描述
HTML 解析 常用 HTML 标签、属性、嵌套结构、HTML 实体(命名/十进制/十六进制)
CSS 样式 类选择器、ID 选择器、标签选择器、内联样式
布局引擎 块级布局、Flexbox、CSS Grid
视觉效果 线性渐变、圆角、阴影模拟、透明度
交互 按钮点击事件、鼠标滚轮滚动、命中测试
模板引擎 {{变量}} 替换、数据绑定上下文
线程安全 ConcurrentHashMap、CopyOnWriteArrayList

环境要求

本 API 提供三个版本,请选择与你的加载器和 Minecraft 版本匹配的 jar 文件。

Forge 版本 (1.20.1)

依赖 版本
Minecraft 1.20.1
Forge 47.x
Java 17

Fabric 版本 (1.20.1)

依赖 版本
Minecraft 1.20.1
Fabric Loader >=0.19.3
Fabric API 0.92.11+1.20.1
Java 17

Fabric 版本 (26.2)

依赖 版本
Minecraft 26.2
Fabric Loader >=0.19.3
Fabric API 0.156.0+26.2
Java 25

安装

作为模组依赖

  • Forge 1.20.1:将 htmlcraftapi-1.0.0-1.20.1forge.jar 放入 mods 文件夹
  • Fabric 1.20.1:将 htmlcraftapi-1.0.0-1.20.1fabric.jar 放入 mods 文件夹
  • Fabric 26.2:将 htmlcraftapi-1.0.0-26.2fabric.jar 放入 mods 文件夹

作为开发依赖

Forge 版本(Mojang 映射):

dependencies {
    implementation files('libs/htmlcraftapi-1.0.0-1.20.1forge.jar')
}

Fabric 版本(Yarn 映射,使用 Loom 复合构建):

dependencies {
    modImplementation 'com.htmlcraft.api:htmlcraftapi:1.0.0-1.20.1fabric'
}

对于 Fabric,推荐使用 includeBuild 引入源码项目以便调试:

// settings.gradle (1.20.1)
includeBuild '../HtmlCraftAPI/fabric'

// settings.gradle (26.2)
includeBuild '../HtmlCraftAPI/fabric/26.2'

快速开始

以下示例使用 Forge(Mojang 映射)API。Fabric 1.20.1 版本仅在类名上有所不同(例如 Component → Text、Minecraft → MinecraftClient、GuiGraphics → DrawContext)。Fabric 26.2 版本重构了内部渲染层(GuiGraphics → GuiGraphicsExtractor),但公开的 HTML/CSS API 完全相同。

1. 通过 Builder 创建界面

import com.htmlcraft.api.HtmlRendererAPI;
import com.htmlcraft.api.binding.DataContext;
import com.htmlcraft.api.screen.HtmlScreen;
import net.minecraft.network.chat.Component;

DataContext data = new DataContext();
data.set("title", "My Interface");
data.set("content", "Hello, Minecraft!");

HtmlScreen screen = HtmlRendererAPI.createScreen(Component.literal("My Screen"))
    .html("<div class='container'>" +
          "  <h1>{{title}}</h1>" +
          "  <p>{{content}}</p>" +
          "  <button id='btn-ok'>OK</button>" +
          "</div>")
    .css(".container { padding: 20px; background: #1a1a2e; border-radius: 10px; }" +
         "h1 { color: #e94560; font-size: 16px; }" +
         "p { color: #ffffff; }" +
         "#btn-ok { background: #0f3460; color: #ffffff; border-radius: 6px; padding: 8px; }")
    .data(data)
    .onClick(event -> {
        if ("btn-ok".equals(event.element().getId())) {
            System.out.println("Player clicked the OK button");
        }
    })
    .build();

Minecraft.getInstance().setScreen(screen);

2. 继承 HtmlScreen 实现自定义界面

public class MyScreen extends HtmlScreen {

    public MyScreen() {
        super(Component.literal("My Screen"));
    }

    @Override
    protected String getHtml() {
        return "<div class='root'>Custom content</div>";
    }

    @Override
    protected String getCss() {
        return ".root { padding: 16px; background: #2d2d44; }";
    }
}

3. Forge / Fabric 映射对照

Forge (Mojang) Fabric (Yarn) 描述
net.minecraft.network.chat.Component net.minecraft.text.Text 文本组件
net.minecraft.client.Minecraft net.minecraft.client.MinecraftClient 客户端实例
net.minecraft.client.gui.GuiGraphics net.minecraft.client.gui.DrawContext 绘制上下文
net.minecraft.world.level.saveddata.SavedData net.minecraft.world.PersistentState 存档持久化
net.minecraft.network.FriendlyByteBuf net.minecraft.network.PacketByteBuf 网络缓冲区
net.minecraftforge.network.SimpleChannel ServerPlayNetworking / ClientPlayNetworking 网络通道

核心 API

HtmlRendererAPI

统一入口,提供 Builder 模式来创建 HTML 界面。

方法 描述
createScreen(Component title) 创建界面 Builder

HtmlRendererAPI.Builder

用于配置 HTML、CSS、数据和事件的链式 Builder。

方法 描述
html(String html) 设置 HTML 内容
css(String css) 设置 CSS 样式表
data(DataContext context) 设置模板数据上下文
onClick(Consumer<ClickEvent> handler) 设置点击事件回调
build() 构建 HtmlScreen 实例

HtmlScreen

抽象 HTML 渲染界面基类,继承 Minecraft 的 Screen。

方法 描述
getHtml() 抽象方法,子类提供 HTML 内容
getCss() 重写以提供 CSS 样式
setClickHandler(Consumer<ClickEvent>) 设置点击事件处理器
setPreferredSize(int w, int h) 设置内容区域大小(居中布局)
rebuild() 重建渲染管线(数据变更后刷新)
getRootLayout() 获取布局根节点
getPipeline() 获取渲染管线

HtmlScreen.ClickEvent

包含被点击元素和坐标的点击事件。

方法 描述
element() 被点击的 DOM 元素
button() 鼠标按钮(0=左键、1=右键、2=中键)
x() / y() 点击坐标

DataContext

模板变量上下文,线程安全。

方法 描述
set(String key, Object value) 设置变量
get(String key) 获取变量
getString(String key) 获取字符串值
has(String key) 检查变量是否存在
clear() 清除所有变量

HtmlElement

DOM 元素节点。

方法 描述
tagName() 获取标签名
getId() 获取 id 属性
hasClass(String) 检查是否含有指定类
getAttribute(String) 获取属性值
children() 获取子节点

支持的 CSS 属性

布局

属性 值
display block / flex / inline / grid / none
flex-direction row / column
justify-content flex-start / center / flex-end / space-between / space-around
align-items flex-start / center / flex-end / stretch
gap 像素值
grid-template-columns repeat(N, 1fr)

盒模型

属性 描述
width / height 像素值、auto
padding 像素值
margin 像素值
border-width 像素值

视觉效果

属性 值
background #RRGGBB / #AARRGGBB / #RRGGBBAA
background(渐变) linear-gradient(to bottom, #color1, #color2)
color 文本颜色
border-color 边框颜色
border-radius 圆角像素值
box-shadow offsetX offsetY blur spread #color
opacity 0.0 - 1.0

文本

属性 值
font-size 像素值
text-align left / center / right

定位与溢出

属性 值
position static / relative / absolute / fixed
overflow-x / overflow-y visible / hidden / scroll / auto
z-index 整数

模板引擎

在 HTML 中使用 {{变量}} 占位符。在 init() 过程中,TemplateEngine.render() 会用 DataContext 中的值替换这些占位符。

DataContext data = new DataContext();
data.set("player_name", "Steve");
data.set("level", 30);

// HTML 模板
String html = "<div>Player: {{player_name}} | Level: {{level}}</div>";

特殊字符会自动转义为 HTML 实体以防止注入。


渲染管线

HTML 字符串
    ↓
HtmlParser(解析为 DOM 树)
    ↓
StyleSheet + CssParser(加载 CSS 规则)
    ↓
StyleCalculator(计算每个元素的最终样式)
    ↓
LayoutEngine(执行布局,生成 LayoutNode 树)
    ↓
RenderPipeline(生成并执行渲染命令)
    ↓
GuiGraphics(绘制到 Minecraft 屏幕)

包结构

com.htmlcraft.api
├── HtmlCraftAPI.java          // 模组主类
├── HtmlRendererAPI.java       // 公开入口 + Builder
├── core/
│   ├── HtmlDocument.java      // HTML 文档
│   ├── HtmlElement.java       // DOM 元素节点
│   ├── HtmlNode.java          // DOM 节点接口
│   └── HtmlText.java          // DOM 文本节点
├── parser/
│   ├── HtmlParser.java        // HTML 解析器
│   └── CssParser.java         // CSS 解析器
├── style/
│   ├── StyleSheet.java        // CSS 样式表
│   ├── StyleCalculator.java   // 样式计算器
│   └── ComputedStyle.java     // 计算后样式
├── layout/
│   ├── LayoutEngine.java      // 布局引擎
│   └── LayoutNode.java        // 布局节点
├── render/
│   ├── RenderPipeline.java    // 渲染管线
│   ├── RenderContext.java     // 渲染上下文
│   ├── RenderCommand.java     // 渲染命令接口
│   └── commands/              // 具体渲染命令
│       ├── FillRectCommand.java
│       ├── DrawTextCommand.java
│       ├── DrawBorderCommand.java
│       └── BlitTextureCommand.java
├── binding/
│   ├── DataContext.java       // 数据绑定上下文
│   └── TemplateEngine.java    // 模板引擎
└── screen/
    └── HtmlScreen.java        // HTML 渲染界面基类

点击事件

可点击的元素包括:

  • <button> 标签
  • <a> 标签
  • 任何带有 id 属性的元素

点击会触发 ClickEvent 回调。使用 event.element().getId() 来识别被点击的元素。


滚动支持

带有 overflow-y: scroll 或 overflow-y: auto 的元素会自动响应鼠标滚轮滚动。每次滚动步进 20 像素。


许可证

LGPL-2.1

作者

Yifei