DELETEME 本页已被 Fabric Data Generation API 取代,请参见 此教程

动态模型生成

动态生成的模型主要用于将模型添加到生成的物品和方块,或者需要为大量的物品、方块自动创建模型。我们先从注册新物品开始。

public class ExampleMod implements ModInitializer {
 
    public static final Item EXAMPLE_ITEM = new Item(new Item.Settings());
 
    @Override
    public void onInitialize() {
        Registry.register(Registry.ITEM, new Identifier("example_mod", "example_item"), EXAMPLE_ITEM);
    }
}

完成之后,我们需要自动生成模型json的函数。

    public static String createItemModelJson(String id, String type) {
        if ("generated".equals(type) || "handheld".equals(type) {
        //两种物品类型。handheld抓哟用于工具,generate用于其他的一切物品。
            return "{\n" +
                   "  \"parent\": \"item/" + type + "\",\n" +
                   "  \"textures\": {\n" +
                   "    \"layer0\": \"example_mod:item/" + id + "\"\n" +
                   "  }\n" +
                   "}";
        } else if ("block".equals(type)) {
        //然而,如果物品是方块的物品,与前面的两个会有不同的模型。
            return "{\n" +
                   "  \"parent\": \"example_mod:block/" + id + "\"\n"
                   "}";
        }
        else {
        //如果类型无效,返回空的json字符串。
            return "";
        }
    }

注册生成的模型

最后,我们需要将物品模型注入到 Minecraft。我们通过对 ModelLoader#loadModelFromJson 进行mixin来完成。

@Mixin(ModelLoader.class)
public class ModelLoaderMixin {
 
    @Inject(method = "loadModelFromJson", at = @At(value = "INVOKE", target = "Lnet/minecraft/resource/ResourceManager;getResource(Lnet/minecraft/util/Identifier;)Lnet/minecraft/resource/Resource;"), cancellable = true)
    public void loadModelFromJson(Identifier id, CallbackInfoReturnable<JsonUnbakedModel> cir) {
        //首先,检查当前的物品模型是否已经被模组注册,如果还没有,则继续。
        if (!"example_mod".equals(id.getNamespace())) return;
        //这里,我们进行不同的检查以查看当前的物品是方块物品、工具还是其他的。
        //可以通过多种方式完成,例如将我们的所有物品放到一个Set或List中,然后检查当前的物品是否包含在里面。
        //对于本教程,我们只有1个物品,所以不需要这么做,我们使用默认的物品类型“generated”。
        String modelJson = ExampleMod.createItemModelJson(id, "generated");
        if ("".equals(modelJson)) return;
        //在继续之前,检查我们得到的json字符串是否有效。
        JsonUnbakedModel model = JsonUnbakedModel.deserialize(modelJson);
        model.id = id.toString();
        cir.setReturnValue(model);
        cir.cancel();
    }
}