User Tools

Site Tools


← Go back to the homepage

Fabric Tutorials



These pages are essential must-reads when modding with Fabric, and modding Minecraft in general, if you are new to modding, it is recommended you read the following.


Blocks and Block Entities

Data Generation

World Generation


These pages will guide you through Mojang's Brigadier library which allows you to create commands with complex arguments and actions.


These pages will guide you through using the many events included in Fabric API, and how to create your own events for you or other mods to use.



Mixins & ASM

These pages will guide you through the usage of SpongePowered's Mixin library, which is a highly complex topic. We recommend you read these pages thoroughly.



Contribute to Fabric


:!: This page has been replaced by the Fabric Data Generation API tutorials, which you can find here.

Dynamic Model Generation

Dynamically generated models can mainly be used to add models to items or blocks that are generated, or if you want to auto-create them for a large number of items or blocks. As always, we will start off by first registering a new item.

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

After that is done, we need a function that will generate the model json.

    public static String createItemModelJson(String id, String type) {
        if ("generated".equals(type) || "handheld".equals(type)) {
        //The two types of items. "handheld" is used mostly for tools and the like, while "generated" is used for everything else. 
            return "{\n" +
                   "  \"parent\": \"item/" + type + "\",\n" +
                   "  \"textures\": {\n" +
                   "    \"layer0\": \"example_mod:item/" + id + "\"\n" +
                   "  }\n" +
        } else if ("block".equals(type)) {
        //However, if the item is a block-item, it will have a different model json than the previous two.
            return "{\n" +
                   "  \"parent\": \"example_mod:block/" + id + "\"\n" +
        else {
        //If the type is invalid, return an empty json string.
            return "";

Registering Generated Models

Finally, we need to inject the item model into Minecraft. We do this by mixin into ModelLoader#loadModelFromJson

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) {
        //First, we check if the current item model that is being registered is from our mod. If it isn't, we continue.
        if (!"example_mod".equals(id.getNamespace())) return;
        //Here, we can do different checks to see if the current item is a block-item, a tool, or other.
        //This can be done in a lot of different ways, like putting all our items in a Set or a List and checking if the current item is contained inside.
        //For this tutorial, we only have 1 item, so we will not be doing that, and we will be going with "generated" as default item type.
        String modelJson = ExampleMod.createItemModelJson(id, "generated");
        if ("".equals(modelJson)) return;
        //We check if the json string we get is valid before continuing.
        JsonUnbakedModel model = JsonUnbakedModel.deserialize(modelJson); = id.toString();
tutorial/dynamic_model_generation.txt · Last modified: 2022/11/05 12:05 by jab125