Theseus 模组文档
API 参考 / 渲染、资源与语言

ResourceManager


想先跑起来?

这一页是签名与行为参考。按命名空间加载贴图,失败行为见页面。直接做一遍:教程 · 贴图与译文。

用途:模组资源入口,经 ModContext#resources() 获取。读取模组自带的字节、文本与图像。

路径约定

完整签名

java
public interface ResourceManager {

    byte[] readBytes(ResourceLocation location) throws ResourceNotFoundException;

    String readText(ResourceLocation location) throws ResourceNotFoundException;

    RenderImage loadImage(ResourceLocation location) throws ResourceNotFoundException;

    CompletableFuture<RenderImage> loadImageAsync(ResourceLocation location);

    List<ResourceLocation> list(String pathPrefix);

    RenderImage createImage(int width, int height, int[] argbPixels);
}

readBytes(location) / readText(location)

签名:

java
byte[] readBytes(ResourceLocation location) throws ResourceNotFoundException;

String readText(ResourceLocation location) throws ResourceNotFoundException;

行为:读取原始字节 / 以 UTF-8 读取文本(语言文件、JSON 配置等)。两级查找都未命中或读取失败时抛 ResourceNotFoundException。读取不依赖渲染上下文,可在任意线程执行(但阻塞 IO 别放在渲染线程)。

loadImage(location)

签名:

java
RenderImage loadImage(ResourceLocation location) throws ResourceNotFoundException;

行为:同步加载并解码图像(在调用线程解码,只依赖 JDK)。找不到或解码失败抛 ResourceNotFoundException。返回的句柄可在任意后端绘制,但后端纹理在渲染线程首次绘制时才创建,所以句柄要在渲染线程用。

loadImageAsync(location)

签名:

java
CompletableFuture<RenderImage> loadImageAsync(ResourceLocation location);

行为:在宿主 IO 线程池解码,是游戏/渲染线程加载大图的首选。失败时 future 以 ResourceNotFoundException 异常完成。

list(pathPrefix)

签名:

java
List<ResourceLocation> list(String pathPrefix);

行为:列出模组 jar 内 assets/ 下的条目(磁盘覆盖目录不参与枚举),用于「扫描目录里全部皮肤/音效」。

createImage(width, height, argbPixels)

签名:

java
RenderImage createImage(int width, int height, int[] argbPixels);

行为:由像素数组生成新图像(配合 getPixelsARGB() 做模糊/变暗/缩放等处理)。width / height 须大于 0;argbPixels 为 0xAARRGGBB,长度不小于 width * height;否则抛 IllegalArgumentException。

示例:加载贴图并容忍缺失

java
private RenderImage logo;

@Override
public void onInit(ModContext ctx) {
    try {
        logo = ctx.resources().loadImage(ResourceLocation.of("mymod", "textures/logo.png"));
    } catch (ResourceNotFoundException e) {
        ctx.getLogger().warn("缺少 logo 贴图,使用纯色占位: " + e.location());
    }
}