:!: //This page has been replaced by the Fabric Data Generation API tutorials, [[tutorial:datagen_model|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());
@Override
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
@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 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);
model.id = id.toString();
cir.setReturnValue(model);
}
}