For the newer version, see here.
---------------------------------------------------
It's pretty certain that the first time you try to create a block or an item, it will probably wind up looking like this:
The dreaded missing texture / missing model. |
Unfortunately, there are a lot of things you have to get exactly right before your blocks and items will render properly, and it's often not easy to discover what the problem is.
You can find working examples of a simple block (MBE01) and a simple item (MBE10) here.
Alternatively, this troubleshooting flowchart below might help.
**Note*** - it seems that recent updates to Forge have changed the error messages for some of these errors. If the guide leads you to a dead end, it might be worth checking each of the possible errors to see if it matches yours. I'll try to update it soonish.
Before you start
If the problem appears after you have been testing your mod for a while, it is worth taking 2 minutes to start Minecraft, generate a new test world, and see if you still have the problem. Sometimes the remapping of block and item IDs (that happens when you add and remove blocks or items to your mod) can lead to subtle mismatches and very confusing bugs.Is it a Block problem, an ItemBlock problem, or an Item problem?
A Block problem will look wrong when you place it in the world, for exampleBlock problem |
ItemBlock problem or Item problem |
If you have a Block problem, go to Blocks Step 1 below.
If you have an Item (ItemBlock) problem, go to Items Step 1.
If you have both, solve the Block problem first.
Blocks - Step 1 - Registration
Does your block appear in the creative tabs? If not, the problem is probably one of the following:- Your Block registration is not being called (must be called during preInitialisation)
GameRegistry.registerBlock(blockSimple, "mbe01_block_simple");
- You have passed the wrong block to registerBlock.
- You haven't set the appropriate creative tab in your Block
public BlockSimple() { super(Material.rock); this.setCreativeTab(CreativeTabs.tabBlock); // the block will appear on the Blocks tab in creative}
Blocks - Step 2
If you place your block in the world, can you see it at all?Invisible block |
// render using a BakedModel (mbe01_block_simple.json --> mbe01_block_simple_model.json)
// not strictly required because the default (super method) is 3.
@Override
public int getRenderType() { return 3; }
Blocks - Step 3 - Check the console for error messages
If you place your block in the world, does it look like this?Missing block texture / missing block model. |
If it does look like this, look in the error console for messages which mention your block's name, eg messages like this:
> [22:14:59] [Client thread/WARN]: Unable to load block model: 'minecraftbyexample:block/mbe01_block_simple.json
> [22:15:00] [Client thread/WARN]: Missing model for: minecraftbyexample:mbe01_block_simple.json
> [22:20:06] [Client thread/WARN]: Unable to load variant: normal from from minecraftbyexample:mbe01_block_simple#normal
> [23:12:54] [Client thread/ERROR]: Using missing texture, unable to load minecraft:textures/blocks/mbe01_block_simple_face1.png
java.io.FileNotFoundException: minecraft:textures/blocks/mbe01_block_simple_face1.png
Did you find any? If so, continue in Step 4. Otherwise, skip to Step 7.
Blocks - Step 4 - FileNotFoundException?
Does your console contain a FileNotFoundException for your block?
For example
> java.lang.RuntimeException: Encountered an exception when loading model definition of model minecraftbyexample:blockstates/mbe01_block_simple.json
at net.minecraft.client.resources.model.ModelBakery.getModelBlockDefinition(ModelBakery.java:177) ~[ModelBakery.class:?]
> Caused by: java.io.FileNotFoundException: minecraftbyexample:blockstates/mbe01_block_simple.json
- one of your filenames is wrong,
- your block name is wrong (doesn't match your blockstates filename),
- one of the filenames in your json files is wrong,
- your resources folder structure is wrong, or
- your resources folder isn't being copied to the right place.
The extra error information will usually tell you what part of the code was looking for the file. Fix it by looking through the list of causes below. If you need more help figuring out which part is the problem, see Step 5.
Some notes about getting filenames and folder structure right:
Your project directory structure should look like the one in this example project here.i.e. src/main/resources/assets/minecraftbyexample/
When you build your project to debug or run it, the resources in these folders will be copied into the build folder
build/classes/main/assets/minecraftbyexample
which is where forge expects to find them.
There are a few reasons things can go wrong, usually one of the following:
- You have spelled a folder name incorrectly, check very closely!
- You have added .json or .png where it's not required, for example
{ "variants": { "normal": { "model": "minecraftbyexample:mbe01_block_simple_model.json" } } }
- I'm told that underscores(_) are not permitted in texture names. For example, in a model json, the texture path "MODID:items/TEXTURE", TEXTURE must not contain any underscores.
- When specifying a resource location, or in one of your json files, you have added the wrong domain, or forgotten it entirely. This will be obvious from the error message, for example
java.io.FileNotFoundException: misspelleddomain:models/block/mbe01_block_simple_model.json{ "variants": { "normal": { "model": "misspelleddomain:mbe01_block_simple_model" } } }
or missing entirely
java.io.FileNotFoundException: minecraft:models/block/mbe01_block_simple_model.json{ "variants": { "normal": { "model": "mbe01_block_simple_model" } } }
- Upper/Lower case must match! myModFolder is not the same as mymodfolder!
Your mod ID, all your package names and folder names should be all lower case. Your filenames can be mixed case if you are careful to be consistent, but it's probably easier to leave them all lower case too. Especially since if you use GitHub for your project, it ignores your filename case and will cause you all sorts of grief when you try to fix it without realising what's happening. (Hint: rename myWROngFile.json to dummyname.json, commit, then rename to mywrongfile.json and commit again). - If you are using IntelliJ 14 instead of Eclipse, you should add this line to the bottom of your build.gradle file, otherwise it won't copy your resources to the right place.
sourceSets { main { output.resourcesDir = output.classesDir } }
See here for more information.
Blocks Step 5 - tracking down the source of FileNotFoundException
If you are getting a FileNotFoundException, the console message will also tell you what part of the code was looking for the file. These are:Your blockstates.json file is not being found
> [22:06:34] [Client thread/WARN]: Unable to load definition minecraftbyexample:mbe01_block_simple#normal> java.lang.RuntimeException: Encountered an exception when loading model definition of model minecraftbyexample:blockstates/mbe01_block_simple.json
at net.minecraft.client.resources.model.ModelBakery.getModelBlockDefinition(ModelBakery.java:177) ~[ModelBakery.class:?]
Caused by: java.io.FileNotFoundException: minecraftbyexample:blockstates/mbe01_block_simple.json
Your blockstates file must exactly match the registered name of the block. It must be stored in the correct folder (see above).
Model name wrong in blockstates file, or model filename wrong or in wrong folder
> [22:14:59] [Client thread/WARN]: Unable to load block model: 'minecraftbyexample:block/mbe01_block_simple_model' for variant: 'minecraftbyexample:mbe01_block_simple#normal'
> java.io.FileNotFoundException: minecraftbyexample:models/block/mbe01_block_simple_model.json
> java.io.FileNotFoundException: minecraftbyexample:models/block/mbe01_block_simple_model.json
at
> net.minecraft.client.resources.FallbackResourceManager.getResource( FallbackResourceManager.java:70) ~[FallbackResourceManager.class:?]
> [22:15:00] [Client thread/WARN]: Missing model for: minecraftbyexample:mbe01_block_simple#normal
> [22:15:00] [Client thread/WARN]: No weighted models for: minecraftbyexample:mbe01_block_simple#normal
> net.minecraft.client.resources.FallbackResourceManager.getResource( FallbackResourceManager.java:70) ~[FallbackResourceManager.class:?]
> [22:15:00] [Client thread/WARN]: Missing model for: minecraftbyexample:mbe01_block_simple#normal
> [22:15:00] [Client thread/WARN]: No weighted models for: minecraftbyexample:mbe01_block_simple#normal
Texture filenames incorrect in block model.json file
> [23:12:54] [Client thread/ERROR]: Using missing texture, unable to load minecraftbyexample:textures/blocks/mbe01_block_simple_face1.pngjava.io.FileNotFoundException: minecraftbyexample:textures/blocks/mbe01_block_simple_face1.png
at
> net.minecraft.client.resources.FallbackResourceManager.getResource( FallbackResourceManager.java:70) ~[FallbackResourceManager.class:?]
Your block model file has an incorrect filename, or the texture filename is wrong or in the wrong spot.
{ "parent": "block/cube_all"
"textures":{
"all": { "minecraftbyexample:blocks/mbe01_block_simple_face1" }} }
Wrong parent model in your block model.json file
> [23:24:26] [Client thread/WARN]: In parent chain: minecraftbyexample:item/mbe01_block_simple -> minecraftbyexample:block/mbe01_block_simple_model -> minecraft:block/cubeerror; unable to load model: 'minecraft:block/cubeerror'java.io.FileNotFoundException: minecraft:models/block/cubeerror.json
at
> net.minecraft.client.resources.FallbackResourceManager.getResource(FallbackResourceManager.java:70) ~[FallbackResourceManager.class:?]
at net.minecraft.client.resources.model.ModelBakery.loadModel(ModelBakery.java:260) ~[ModelBakery.class:?]
> [23:24:29] [Client thread/WARN]: Missing model for: minecraftbyexample:mbe01_block_simple#normal
> [23:24:29] [Client thread/WARN]: No weighted models for: minecraftbyexample:mbe01_block_simple#normal
{ "parent": "block/cubeerror"
"textures":{
"all": { "minecraftbyexample:blocks/mbe01_block_simple_face1" }} }
Blocks - Step 6 - Console errors other than FileNotFoundException
If your texture is missing but there is no FileNotFoundException, it is usually a block variants mismatch problem. For exampleIncorrect variant names in blockstates files
[22:20:06] [Client thread/WARN]: Unable to load variant: normal from minecraftbyexample:mbe01_block_simple#normal{
"variants": {
"not_normal": { "model": "minecraftbyexample:mbe01_block_simple_model" }
}
}
Variant listing in blockstates.json doesn't match your code blockstate
[22:26:49] [Client thread/WARN]: Unable to load variant: colour=red,facing=north from minecraftbyexample:mbe03_block_variants#colour=red,facing=northThis might be caused by a mismatch in your blockstates.json file
{
"variants": {
"colour=red,facing=error": { "model": "minecraftbyexample:mbe03_block_variants_model_red"},
"colour=red,facing=east": { "model": "minecraftbyexample:mbe03_block_variants_model_red", "y": 90 },
"colour=red,facing=south": { "model": "minecraftbyexample:mbe03_block_variants_model_red", "y": 180 },
"colour=red,facing=west": { "model": "minecraftbyexample:mbe03_block_variants_model_red", "y": 270 },
"colour=green,facing=north": { "model": "minecraftbyexample:mbe03_block_variants_model_green" },
... etc...
}
or perhaps your Block.createBlockState() is wrong...
// necessary to define which properties your blocks use
// will also affect the variants listed in the blockstates model file
@Override
protected BlockState createBlockState()
{
return new BlockState(this, new IProperty[] {WRONGPROPERTY});
}
note also that for blockstates with multiple properties the order is important, i.e.
colour=red,facing=north
won't matchfacing=north,colour=red
Incorrect filename or resource location in blockstates.json file
[14:14:22] [Client thread/ERROR] [FML]: Model definition for location
minecraftpoorexample:mbe01_block_simple_model#normal not found
eg{
"variants": {
"normal": { "model": "minecraftpoorexample:mbe01_block_simple_model" }
}
}
Blocks Step 7 - no console error message
I have only ever seen this happen in two cases:a) when one of the texture names is missing from the model file.
For example - the cube_all model needs a texture called #all:
{
"parent": "block/cube_all",
"textures": {
"all_wrong": "minecraftbyexample:blocks/mbe13_block_simple_all_faces",
}
}
i.e. the parent model cube_all defines #all but we haven't provided it.
{ "parent": "block/cube", "textures": { "particle": "#all", "down": "#all", "up": "#all", "north": "#all", "east": "#all", "south": "#all", "west": "#all" } }
b) when you have forgotten your mod ID from the blockstates file, eg
blockstates.json
{
"variants": {
"normal": { "model": "mbe01_block_simple_model" }
}
}
instead of
{
"variants": {
"normal": { "model": "minecraftbyexample:mbe01_block_simple_model" }
}
}
"normal": { "model": "minecraftbyexample:mbe01_block_simple_model" }
}
}
Blocks Step 8 - No idea.
Ask your question at the forum... and when you've solved it, post me a comment to tell me what the problem was.
Items Step 1 - Registration
For ItemBlocks this is not relevant, skip to Step 2. Otherwise - does your Item appear in the creative tabs? If not, the problem is probably one of the following:
- Your Item registration is not being called (must be called during preInitialisation)
GameRegistry.registerItem(itemSimple, "mbe10_item_simple");
- You have passed the wrong item to registerItem.
- You haven't set the appropriate creative tab in your Item
public class ItemSimple extends Item { public ItemSimple() { this.setCreativeTab(CreativeTabs.tabMisc); // the item will appear on the Miscellaneous tab in creative } }
Items Step 2- ItemCameraTransform problem
Does your model have the right appearance, but is the wrong size, is distorted, or is sitting at the wrong angle in the inventory, your hand, or in third person view?
ItemCameraTransform problem |
If so, you have a problem with the ItemCameraTransform information in your item model json. See here for more information.
Otherwise, contine to step 3...
Items Step 3 - Check the console for error messages
Look in the error console for messages which mention your block or item's name, eg messages like this:
> [23:31:17] [Client thread/WARN]: Unable to load item model: 'minecraftbyexample:item/mbe01_block_simple' for item: 'minecraftbyexample:mbe01_block_simple'
java.io.FileNotFoundException: minecraftbyexample:models/item/mbe01_block_simple.json
at
> net.minecraft.client.resources.FallbackResourceManager.getResource( FallbackResourceManager.java:70) ~[FallbackResourceManager.class:?]
at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:67) ~[SimpleReloadableResourceManager.class:?]
at net.minecraft.client.resources.model.ModelBakery.loadModel(ModelBakery.java:260) ~[ModelBakery.class:?]
> [23:31:34] [Client thread/WARN]: Missing model for: minecraftbyexample:item/mbe01_block_simple
> [23:31:17] [Client thread/WARN]: Unable to load item model: 'minecraftbyexample:item/mbe01_block_simple' for item: 'minecraftbyexample:mbe01_block_simple'
java.io.FileNotFoundException: minecraftbyexample:models/item/mbe01_block_simple.json
at
> net.minecraft.client.resources.FallbackResourceManager.getResource( FallbackResourceManager.java:70) ~[FallbackResourceManager.class:?]
at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:67) ~[SimpleReloadableResourceManager.class:?]
at net.minecraft.client.resources.model.ModelBakery.loadModel(ModelBakery.java:260) ~[ModelBakery.class:?]
> [23:31:34] [Client thread/WARN]: Missing model for: minecraftbyexample:item/mbe01_block_simple
Did you find any? If so, continue to Step 4. Otherwise, skip to Step 6.
Items Step 4- FileNotFoundException
Does your console contain a FileNotFoundException for your Item?
For example
java.io.FileNotFoundException: minecraftbyexample:models/item/mbe01_block_simple.json
at
> net.minecraft.client.resources.FallbackResourceManager.getResource( FallbackResourceManager.java:70) ~[FallbackResourceManager.class:?]
at
> net.minecraft.client.resources.SimpleReloadableResourceManager.getResource( SimpleReloadableResourceManager.java:67) ~[SimpleReloadableResourceManager.class:?]
at net.minecraft.client.resources.model.ModelBakery.loadModel(ModelBakery.java:260) ~[ModelBakery.class:?]
- For Items: your item model filename doesn't match the registered item name
- For ItemBlocks: your item model filename doesn't match the registered block name
- For Items with subtypes (this.setHasSubtypes(true);), you haven't registered the subtype names properly using ModelBakery.addVariantName (see here for an example.)
- one of the filenames in your json files is wrong,
- your resources folder structure is wrong, or
- your resources folder isn't being copied to the right place.
For general hints about getting folder structures and filenames right, see Blocks Step 4 above.
item model filename or location wrong
> [23:31:17] [Client thread/WARN]: Unable to load item model: 'minecraftbyexample:item/mbe01_block_simple_model' for item: 'minecraftbyexample:mbe01_block_simple'
java.io.FileNotFoundException: minecraftbyexample:models/item/mbe01_block_simple.json
java.io.FileNotFoundException: minecraftbyexample:models/item/mbe01_block_simple.json
item model.json file contains incorrect parent model filename
> [17:07:34] [Client thread/WARN]: In parent chain: minecraftbyexample:item/mbe01_block_simple -> minecraftbyexample:block/mbe01_block_simple_model_error; unable to load model: 'minecraftbyexample:block/mbe01_block_simple_model_error'
> java.io.FileNotFoundException: minecraftbyexample:models/block/mbe01_block_simple_model_error.json
at
> net.minecraft.client.resources.FallbackResourceManager.getResource( FallbackResourceManager.java:70) ~[FallbackResourceManager.class:?]
> [17:07:38] [Client thread/WARN]: Missing model for: minecraftbyexample:item/mbe01_block_simple
{
"parent": "minecraftbyexample:block/mbe01_block_simple_model_error", "display": { "thirdperson": { "rotation": [ 10, -45, 170 ], "translation": [ 0, 1.5, -2.75 ], "scale": [ 0.375, 0.375, 0.375 ] } } }
Item Step 5 - Console errors other than FileNotFoundException
Never got any of these, so can't help there... Ask your question at the forum... and when you've solved it, post me a comment to tell me what the problem was...
Item Step 6 - No error messages in the console
This is usually caused when the model renderer goes looking for your item model in the registry, but doesn't find it, so it silently substitutes the missing model instead. Typically this is because you have messed up the registration with the itemModelMesher.// required in order for the renderer to know how to render your item.
ModelResourceLocation itemModelResourceLocation = new ModelResourceLocation("minecraftbyexample:mbe10_item_simple", "inventory");
final int DEFAULT_ITEM_SUBTYPE = 0;
Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(StartupCommon.itemSimple, DEFAULT_ITEM_SUBTYPE, itemModelResourceLocation);
Typical causes:
- Your model registration with the model mesher is not being executed. It must be done in the init phase (not preinit), and must be done in the client proxy.
- The resource location you have specified is incorrect, missing, or in the wrong location. See Blocks Step 4 above for advice on making sure that the filenames and locations are correct. Unfortunately, the model mesher doesn't raise any error messages if you get it wrong.
- Your Item has subtypes (this.setHasSubtypes(true);), but you haven't properly registered them with
ModelBakery.addVariantName("mymodid:subtype1", "mymodid:subtype2", etc)
and for each subtype metadata value:
ItemModelMesher().register(StartupCommon.itemSimple, ITEM_SUBTYPE_X_METADATA, itemModelResourceLocationSubTypeX);
See here for a working example. The ModelResourceLocation for each subtype must match the strings you provided to ModelBakery. Don't forget the domain i.e. "mymodid:".
If your item has subtypes but you want the registry to ignore metadata, use the "anonymous class" technique below instead
Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(itemVariants,
new ItemMeshDefinition() {
public ModelResourceLocation getModelLocation(ItemStack stack) {
return new ModelResourceLocation("spawn_egg", "inventory");
}
});
A useful breakpoint to solve registration problems is to set a breakpoint at
ItemModelMesher::
public IBakedModel getItemModel(ItemStack stack)
{
Item item = stack.getItem();
IBakedModel ibakedmodel = this.getItemModel(item, this.getMetadata(stack));
}
You can then trace in, to compare 1) the model that your item is looking for, against 2) the contents of the registry. Where they don't match, you can usually see why immediately.
Hey TGG, I got a weird problem where the console suggests that there's a missing file for a variant of the inventory model? Any ideas?
ReplyDelete[Client thread/ERROR] [FML]: Exception loading model for variant colorama:stainedStoneBricks_3#inventory
java.lang.Exception: Could not load model definition for variant colorama:stainedStoneBricks_3#inventory
Hi
DeleteProbably best if you ask your question on the minecraft forum, we can help you figure it out much faster over there.
http://www.minecraftforge.net/forum/index.php?board=73.0
-TGG
I have the same problem. Did you fixed it yet?
DeleteHOLY SHIT I SPENT HOURS TRYING TO FIGURE OUT MY FILE NOT FOUND ERROR BUT I WAS JUST ON A VERSION OF INTELLIJ THAT NEEDED THE EXTRA LINE IN GRADLE.BUILD AAAAGGGGGHGHHHHH
ReplyDeleteTHANK YOU SO MUCH
ReplyDelete