Генерация динамической модели

Динамически создаваемые модели в основном можно использовать для добавления моделей к создаваемым предметам или блокам, или если вы хотите автоматически создавать их для большого количества предметов или блоков. Как всегда, мы начнем с того, что сначала зарегистрируем новый предмет:

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" используется в основном для инструментов и тому подобного, в то время как "generated" используется для всего остального. 
            return "{\n" +
                   "  \"parent\": \"item/" + type + "\",\n" +
                   "  \"textures\": {\n" +
                   "    \"layer0\": \"example_mod:item/" + id + "\"\n" +
                   "  }\n" +
                   "}";
        } else if ("block".equals(type)) {
        //Однако, если предмет является блоком, он будет иметь другую модель json, чем предыдущие два.
            return "{\n" +
                   "  \"parent\": \"example_mod:block/" + id + "\"\n" +
                   "}";
        }
        else {
        //Если тип недопустим, верните пустую строку json.
            return "";
        }
    }

Регистрация сгенерированных моделей

Наконец, нам нужно внедрить модель предмета в Minecraft. Мы делаем это, подключаясь к ModelLoader#loadModelFromJson через миксин:

@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;
        //Здесь мы можем выполнять различные проверки, чтобы определить, является ли текущий предмет блоком, инструментом или чем-то другим.
        //Это можно сделать множеством разных способов, например, поместить все наши предметы в Набор или Список и проверить, содержится ли внутри текущий предмет.
        //Для этого урока у нас есть только 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);
    }
}