Craftmark:数据驱动的纹理变体

Craftmark:数据驱动的纹理变体

为作者提供的强大实用工具,允许无需编程即可为物品和方块创建无数纹理变体!

logo

Craftmark 允许整合包作者根据方块的合成方式为其赋予不同的外观——用黄铜制造的机器外观是黄铜的,用钢铁制造的机器外观是钢铁的,正常制造的机器外观则很正常。按物品实例,而非按方块类型:两个木桶可以并排放置,却穿着不同的外观。

为什么整合包需要这个

你已经整合了跨模组的配方——用机械动力的黄铜制造存储控制器,用热力基本金属制造熔炉。配方讲述了故事,但方块本身没有。资源包做不到这点:它会给每一个方块重新贴图,无论它是怎么获得的。Craftmark 让外观跟随单个合成物品:

  • 🎒 在物品栏中 —— 包括快捷栏、鼠标指针和配方书
  • ✋ 握在手中 —— 第一人称和第三人称视角
  • 🧱 放置在世界上 —— 即时生效,无需重新登录
  • ⛏️ 挖掘后重新拾取 —— 外观永久保留
  • 🖼️ 掉落物、物品展示框,甚至破坏粒子都会匹配

像引擎一样构建

  • 作者无需编写代码。 一个变体 = 一行配方脚本(KubeJS) + 资源包中镜像原始材质路径的 PNG 文件。无需映射文件,无需方块注册。
  • 适用于所有方块实体方块 —— 木桶、箱子、熔炉,以及几乎所有模组机器,全自动生效。
  • 无 Mixin。完全基于官方 NeoForge 钩子构建——包括 Sodium 系列渲染器所遵循的模型数据路径。从 1.2.0 开始,如果你同时运行机械动力模组,则存在用于动力学渲染的 mixin。如果你没有安装机械动力,1.2.0 不会 mixin 任何内容。26.x 版本则完全不包含任何 mixin。
  • 附带一个可用的示例(craftmark:brass 木桶)——一个配方脚本,你可以在两分钟内看到效果。
  • 变体物品不会与其普通版本堆叠,以及诊断日志会告诉你包里有多少材质被匹配了。

前置要求:NeoForge,客户端和服务器都需要安装——1.21.1 或 26.1.2–26.2。数据可以通过 KubeJS 或 CraftTweaker 等配方编辑器应用,作为任务奖励发放,或直接通过命令给予。

📦 我需要哪个文件?

  • craftmark-1.5.0.jar —— 适用于 Minecraft 1.21.1。包含完整功能集,包括机械动力和机械动力航空拓展支持。
  • craftmark-1.5.0+26.x.jar —— 适用于 Minecraft 26.1.2 和 26.2(一个文件同时支持两者)。+26.x 的含义正如其字面意思:相同的 1.5.0 版本,为新版本重新构建——没有需要学习的新功能。1.5.0 的所有功能都包含在内,除了机械动力和机械动力航空拓展支持,这些支持将在那些模组更新后恢复。

将现有的 1.21.1 世界迁移到 26.x?你的方块没问题,但已存储在已放置方块上的外观会被重置——重新放置它们,或重新运行应用它们的命令或配方。

可选依赖:

  • 机械动力(1.2.0)—— 目前仅限 1.21.1
  • Jade(1.4.0)
  • JEI 物品管理器(1.4.0)
  • Sable & 机械动力航空拓展(1.5.0)—— 目前仅限 1.21.1

可选依赖会添加新功能,但本模组在没有它们的情况下也能完美运行。

权限:

  • 你可以将此模组添加到你的整合包中,无需获得许可。
  • 你可以制作附加模组,无需获得许可,只要它们将 Craftmark 列为依赖项即可。
  • 你绝对不可以将此模组的文件上传到其他网站。

📚 作者文档

变体如何工作

在首次启动时,Craftmark 会在你的 Minecraft 实例目录中创建一个 craftmark_variants/ 文件夹(与 mods/、config/、saves/ 同级),并生成一个可直接编辑的 brass 示例:

craftmark_variants/
└── brass/                                   ← 一个文件夹 = 一个变体(id: craftmark:brass)
    └── assets/minecraft/textures/block/
        ├── barrel_side.png
        ├── barrel_top.png
        ├── barrel_bottom.png
        └── barrel_top_open.png

在变体文件夹内,你需要使用与原始材质完全相同的资源包布局。brass/assets/minecraft/textures/block/barrel_side.png 会替换原版精灵图 minecraft:block/barrel_side。规则很简单:将你的 PNG 放在其原始路径下,位于你的变体文件夹内。

快速上手(2分钟——无需 KubeJS,无需制作材质)

brass 文件夹已经存在了。开启作弊模式后,运行:

/give @p minecraft:barrel[craftmark:variant="craftmark:brass"]

放置它——黄铜木桶。它在你的手中、物品栏、地面和物品展示框中都是黄铜外观;破坏它,掉落的物品会保留其外观,并且不会与普通木桶堆叠。编辑 craftmark_variants/brass/ 中的 PNG 文件,然后按 F3+T 即可实时查看更改。

制作你自己的变体

  1. 在 craftmark_variants/ 中创建一个文件夹——使用小写字母、数字、_ . -:ruby、steel、diamond…… 其 id 将变为 craftmark:<文件夹名>。
  2. 放入材质,镜像每个原始文件在 assets/ 下的路径:
    craftmark_variants/ruby/assets/refinedstorage/textures/block/controller.png
    (覆盖 refinedstorage:block/controller)
  3. 按 F3+T 重新扫描——新文件夹无需重启即可被识别。
  4. 使用该 id 标记物品:
    /give @p refinedstorage:controller[craftmark:variant="craftmark:ruby"]
  • 只覆盖你想要的部分——跳过某个面,它就会正常渲染。路径错误则会静默保留原始材质(绝不会出现品红色)。
  • 查找原始路径:解压源模组的 jar,在 assets/<ns>/textures/ 下查找;在你的文件夹内镜像该完整路径。
  • 方块形状的物品会自动复用方块材质,平面物品精灵图也以相同方式镜像(assets/<ns>/textures/item/…)。

当面无法被覆盖时:逐方块覆盖 (1.1.0 新增)

 大多数方块使用上述文件夹结构就能完美覆盖——镜像材质路径即可。但少数方块的一个面使用共享的通用材质。一个典型的例子:机器的底部使用 somemod:block/bottom 而非 somemod:block/<那台机器>/bottom。如果你镜像了你预期的路径,什么都不会发生——文件被拼接了,但没有一个面实际使用它,所以那个面仍然是原版外观。

对于这些顽固的面,有一个可选的捷径——只有当一个面拒绝被覆盖时才使用它。无需寻找材质路径,你可以直接指定方块和面:

craftmark_variants/<variant>/by_block/<block-namespace>/<block-path>/<face>.png

例如,要在 brass 变体下覆盖精致存储的存储监视器那顽固的底部:

craftmark_variants/brass/by_block/refinedstorage/storage_monitor/bottom.png

<face> 可以是以下之一:

  • top.png —— 朝上的面
  • bottom.png —— 朝下的面
  • front.png —— 方块朝向的面(例如熔炉的正面)
  • back.png —— 正面的对面
  • left.png / right.png —— 当你正视正面时的左侧/右侧面
  • side.png —— 所有四个水平面同时应用

四个水平面是相对于方块正面的,因此外观会跟随方块旋转——front.png 始终落在正面。特定的面(例如 front.png)优先于 side.png。

值得了解的是:

  • 仅作用于指定的那个方块。它绝不会影响到共享该材质的其他方块——甚至可以让共享一个材质的两个面拥有不同的外观。
  • 无需寻找路径。你指定的是面,而不是底层的精灵图,因此共享/通用材质不再是猜谜游戏。
  • top/bottom 对所有方块都有效。front/back/left/right 需要方块具有水平朝向——原版方块和通过 facing 或自定义 direction 属性旋转的模组(例如精致存储)都适用;对于没有朝向(或放置时朝上/朝下)的方块,请使用 side.png。
  • 它不覆盖非立方体面(内凹面、特殊形状)——那些仍然使用上面的普通文件夹结构。
  • F3+T 可以实时重新加载它,与普通文件夹完全相同。

将其整合到配方中(KubeJS)

命令用于测试;在真正的整合包中,你需要标记合成的输出物品,这样玩家才能获得外观。在 kubejs/server_scripts/ 中:

ServerEvents.recipes(event => {
    event.shapeless(
        Item.of('refinedstorage:controller', '[craftmark:variant="craftmark:ruby"]'),
        ['refinedstorage:controller', 'mymod:ruby']
    ).id('mypack:ruby_controller');
});

调试你的变体

每次资源(重新)加载时,都会为每个找到的变体文件夹记录一行:

craftmark: variant craftmark:brass: 4 texture(s) stitched

计数低于预期 = 某个路径未匹配。F3+T 会重新运行扫描并重新读取新文件夹。

未来计划

内容更新已在 1.5.0 结束。Craftmark 现在也支持 26.1.2 和 26.2,接下来将进入维护阶段:错误修复、小的兼容性调整,以及在那些模组更新后将机械动力/机械动力航空拓展支持带回 26.x。

 

如果你发现错误或对模组有建议,请在 CurseForge 评论或 Discord 服务器中告诉我。对于错误报告,请确保你使用的是最新版本的模组,并给我提供可复现错误的步骤。