In this document, I use strings in the format "foo:bar"
to represent ResourceLocation
s with domain foo
and path bar
. I also use [square brackets]
for placeholders.
On startup and whenever the resources are reloaded (in ModelLoader#setupModelRegistry
), Minecraft iterates through every registered Block
(in ModelLoader#loadBlocks
) and asks its custom IStateMapper
(or DefaultStateMapper
if none has been registered) to create a mapping between every valid IBlockState
of the Block
and the ModelResourceLocation
for that state (with the domain and path pointing to a blockstates file and the variant to a variant within that file). It then attempts to load these models.
DefaultStateMapper
looks for the blockstates file with the Block
's registry name (i.e. assets/[modid]/blockstates/[name].json) and serialises each property and value of the IBlockState
to create the variant name that the model is loaded from (e.g. "enabled=true,type=foobar"