Jimmeh Posted November 2, 2016 Share Posted November 2, 2016 Hey guys, so I'm learning how to create custom items, and for some reason, the JSON file can't be found even though I'm 99% sure my file structure is correct. Here's the code where I register the models (from what I understand, this event is ran client-side once the ModelLoader is ready for models): @SubscribeEvent public static void registerModels(ModelRegistryEvent event){ for(Item item: ItemHandler.INSTANCE.itemList){ ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(Test.MODID + ":" + item.getRegistryName(), "inventory")); } } And here's a screenshot of my folder structure: https://gyazo.com/5833a05b1e69ec11647a312ea24dd5f6 As you can see, I have 'assets.test.models.item.ItemTrainingStaff.json'. The registry name for the item is "ItemTrainingStaff", however, it continues to spit out the error: "Caused by: java.io.FileNotFoundException: test:models/item/ItemTrainingStaff.json". If you have any idea as to why this could be happening, I'm all ears! Thanks! Quote Link to comment Share on other sites More sharing options...
abused_master Posted November 2, 2016 Share Posted November 2, 2016 Personally id just use this method public static String modid = ModInfo.MODID; public static void reg(Item item) { Minecraft.getMinecraft().getRenderItem().getItemModelMesher() .register(item, 0, new net.minecraft.client.renderer.block.model.ModelResourceLocation(modid + ":" + item.getUnlocalizedName().substring(5), "inventory")); } ModInfo.MODID is just where my modid is located, and then have a second method like: public static void registerItemRenders() { } then register that in the client proxy, and just register the item in that method as such: public static void registerItemRenders() { reg(ModItems.testItem); } this is just a suggestion, you dont have to do anything i have stated above Quote Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 Personally id just use this method public static String modid = ModInfo.MODID; public static void reg(Item item) { Minecraft.getMinecraft().getRenderItem().getItemModelMesher() .register(item, 0, new net.minecraft.client.renderer.block.model.ModelResourceLocation(modid + ":" + item.getUnlocalizedName().substring(5), "inventory")); } ModInfo.MODID is just where my modid is located, and then have a second method like: public static void registerItemRenders() { } then register that in the client proxy, and just register the item in that method as such: public static void registerItemRenders() { reg(ModItems.testItem); } this is just a suggestion, you dont have to do anything i have stated above I appreciate the suggestion! I'll try that if I can't figure it out with 'ModelLoader.setCustomModelResourceLocation(...)'. In a previous thread earlier today, I was told to use that rather than getItemModelMesher(). I don't know if this is the "new" way or what, but if it continues to not work, I'll definitely be going back to that. haha Quote Link to comment Share on other sites More sharing options...
abused_master Posted November 2, 2016 Share Posted November 2, 2016 Personally id just use this method public static String modid = ModInfo.MODID; public static void reg(Item item) { Minecraft.getMinecraft().getRenderItem().getItemModelMesher() .register(item, 0, new net.minecraft.client.renderer.block.model.ModelResourceLocation(modid + ":" + item.getUnlocalizedName().substring(5), "inventory")); } ModInfo.MODID is just where my modid is located, and then have a second method like: public static void registerItemRenders() { } then register that in the client proxy, and just register the item in that method as such: public static void registerItemRenders() { reg(ModItems.testItem); } this is just a suggestion, you dont have to do anything i have stated above I appreciate the suggestion! I'll try that if I can't figure it out with 'ModelLoader.setCustomModelResourceLocation(...)'. In a previous thread earlier today, I was told to use that rather than getItemModelMesher(). I don't know if this is the "new" way or what, but if it continues to not work, I'll definitely be going back to that. haha Its just the way i use to register my block and item renders and never had a problem with it ;p Quote Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 I tried that too and it still didn't work .-. I have no idea what I'm doing wrong. I tried working with forge earlier this year and creating an item was a breeze. Now I can't figure it out. haha Quote Link to comment Share on other sites More sharing options...
abused_master Posted November 2, 2016 Share Posted November 2, 2016 post your json code, item class, registry class,proxy class, and main class Quote Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 post your json code, item class, registry class,proxy class, and main class Alrighty, a lot of code inbound. Main: @Mod(modid = Test.MODID, name = Test.MOD_NAME, version = Test.VERSION) public class Test { public static final String VERSION = "1.0.0"; public static final String MODID = "test"; public static final String MOD_NAME = "Test Mod"; @SidedProxy(serverSide = "com.github.jimmeh.server.ServerProxy", clientSide = "com.github.jimmeh.client.ClientProxy") public static ServerProxy PROXY; @Mod.Instance("test") public static Test INSTACE; @Mod.EventHandler public void onPreInit(FMLPreInitializationEvent event){ Test.PROXY.onPreInit(); } @Mod.EventHandler public void onInit(FMLInitializationEvent event){ Test.PROXY.onInit(); } @Mod.EventHandler public void onPostInit(FMLPostInitializationEvent event){ Test.PROXY.onPostInit(); } } ClientProxy: public class ClientProxy extends ServerProxy { public static final Minecraft MINECRAFT = Minecraft.getMinecraft(); @Override public void onPreInit(){ super.onPreInit(); MinecraftForge.EVENT_BUS.register(ClientEventHandler.INSTANCE); } @Override public void onInit(){super.onInit();} @Override public void onPostInit(){ super.onPostInit(); } } Server Proxy: public class ServerProxy { public void onPreInit(){ MinecraftForge.EVENT_BUS.register(ServerEventHandler.INSTANCE); } public void onInit(){ //Items and blocks here ItemHandler.INSTANCE.onInit(); } public void onPostInit(){ } } ItemHandler: public enum ItemHandler { INSTANCE; public List<Item> itemList = new ArrayList<Item>(); public static ItemTrainingStaff staffTraining; public void onInit(){ //this.register your items staffTraining = new ItemTrainingStaff(); this.registerItem(staffTraining); } private void registerItem(ItemBase item){ //GameRegistry.register(item, new ResourceLocation(Test.MODID, item.getItemReference().getRegistryName())); GameRegistry.register(item); this.itemList.add(item); } } ItemBase: public class ItemBase extends Item { private ItemReferences itemReference; public ItemBase(ItemReferences i){ this.itemReference = i; setUnlocalizedName(i.getUnlocalizedName()); setRegistryName(i.getRegistryName()); } public ItemReferences getItemReference() { return itemReference; } } ItemReferences: public enum ItemReferences { /* * For json models, the file name needs to match the registry name * For the lang, use the unlocalized name */ ItemTrainingStaff("ItemTrainingStaff"); private String unlocalizedName; private String registryName; ItemReferences(String u){unlocalizedName = this.registryName = u;} public String getUnlocalizedName() { return unlocalizedName; } public String getRegistryName() { return registryName; } } ItemTrainingStaff: public class ItemTrainingStaff extends ItemBase { public ItemTrainingStaff(){ super(ItemReferences.ItemTrainingStaff); } } ItemTrainingStaff.json: { "parent": "builtin/generated", "textures": { "layer0": "test:items/ItemTrainingStaff" } } I know this is a lot, but thanks for, at the very least, taking a shot at this! Quote Link to comment Share on other sites More sharing options...
trollworkout Posted November 2, 2016 Share Posted November 2, 2016 That whole substring thing is so stupid. I personally set UnlocalizedName and RegistryName to the same string then when I register my model I make my model resource loader load my item/block's registry name Actual example my block public static final Block ORE_COPPER = new BaseBlock( Material.ROCK, Material.ROCK.getMaterialMapColor(), "pickaxe", 1).setHardness(3.5F).setResistance(5.0F).setRegistryName("oreCopper").setUnlocalizedName("oreCopper").setCreativeTab(ModData.CREATIVE_TAB); my model registry ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(ModBlocks.ORE_COPPER), 0, new ModelResourceLocation(ModBlocks.ORE_COPPER.getRegistryName(), "normal")); This way my model name = localized string name = registry string name Life is 3 times easier. Quote Disclaimer: I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it. Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 That whole substring thing is so stupid. I personally set UnlocalizedName and RegistryName to the same string then when I register my model I make my model resource loader load my item/block's registry name Actual example my block public static final Block ORE_COPPER = new BaseBlock( Material.ROCK, Material.ROCK.getMaterialMapColor(), "pickaxe", 1).setHardness(3.5F).setResistance(5.0F).setRegistryName("oreCopper").setUnlocalizedName("oreCopper").setCreativeTab(ModData.CREATIVE_TAB); my model registry ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(ModBlocks.ORE_COPPER), 0, new ModelResourceLocation(ModBlocks.ORE_COPPER.getRegistryName(), "normal")); I just set my unlocalized name = registry name as well. It made sense to me. haha. I notice you have "normal" in your ModelResourceLocation. All tutorials have "inventory" there. If you don't mind, could you explain what that's actually for, because none of them seem to do that Quote Link to comment Share on other sites More sharing options...
trollworkout Posted November 2, 2016 Share Posted November 2, 2016 Also please post the paths of the json/texture files not just the code. Quote Disclaimer: I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it. Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 Also please post the paths of the json/texture files not just the code. Here's the folder structure for my resources: https://gyazo.com/96fc9e00ac32f9d6d926d9dbee54b4c8 Quote Link to comment Share on other sites More sharing options...
trollworkout Posted November 2, 2016 Share Posted November 2, 2016 Blocks are "variants" (blocks that have sub blocks based on condition ex rotated blocks) "multipart" (blocks made out of many pieces that are added or removed based on conditions ex fences) and "normal" (regular blocks with only one look with no facing or anything special) Items in your inventory use "inventory" when you register them. oh and here is my mod I am working on. https://github.com/trollworkout/technorcery Make sure your folder structure is similar to mine. Is only one way to do it Quote Disclaimer: I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it. Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 Blocks are "variants" (blocks that have sub blocks based on condition ex rotated blocks) "multipart" (blocks made out of many pieces that are added or removed based on conditions ex fences) and "normal" (regular blocks with only one look with no facing or anything special) Items in your inventory use "inventory" when you register them. oh and here is my mod I am working on. https://github.com/trollworkout/technorcery Make sure your folder structure is similar to mine. Is only one way to do it Ah, okay. So I'm trying to go through and pick out what could help me here. haha. I see in your ModItems class, you use GameRegistry.register(item) But you aren't setting the model or anything. Could you explain to me in what order you do what? I'm trying to use the (apparently) new events for registering things. RegistryEvent.Register<Item> to register all my items and ModelRegisteryEvent to set all the ModelResourceLocations. Apparently those fire before FMLPreInitializationEvent does Quote Link to comment Share on other sites More sharing options...
trollworkout Posted November 2, 2016 Share Posted November 2, 2016 remove Test.MODID + ":" + from your model loader registry. when you do item.getRegistryName is automatically included This is why is not working The mod is looking for test:test:ItemTrainingStaff Quote Disclaimer: I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it. Link to comment Share on other sites More sharing options...
abused_master Posted November 2, 2016 Share Posted November 2, 2016 Also i strongly suggest using GitHub as if you do need help/ something isnt working correctly, someone can easily create a Pull Request and you can see what they changed/added, and learn greatly from it Quote Link to comment Share on other sites More sharing options...
trollworkout Posted November 2, 2016 Share Posted November 2, 2016 Blocks are "variants" (blocks that have sub blocks based on condition ex rotated blocks) "multipart" (blocks made out of many pieces that are added or removed based on conditions ex fences) and "normal" (regular blocks with only one look with no facing or anything special) Items in your inventory use "inventory" when you register them. oh and here is my mod I am working on. https://github.com/trollworkout/technorcery Make sure your folder structure is similar to mine. Is only one way to do it Ah, okay. So I'm trying to go through and pick out what could help me here. haha. I see in your ModItems class, you use GameRegistry.register(item) But you aren't setting the model or anything. Could you explain to me in what order you do what? I'm trying to use the (apparently) new events for registering things. RegistryEvent.Register<Item> to register all my items and ModelRegisteryEvent to set all the ModelResourceLocations. Apparently those fire before FMLPreInitializationEvent does You don't have to do it like me. I set all my models in a separate client sided only class. https://github.com/trollworkout/technorcery/blob/master/src/main/java/com/technorcery/client/ModelsHandler.java which is called from the client proxy here https://github.com/trollworkout/technorcery/blob/master/src/main/java/com/technorcery/client/ProxyClient.java and the whole proxy is here https://github.com/trollworkout/technorcery/blob/master/src/main/java/com/technorcery/common/Proxy.java this is the main proxy . I just split all my stuff in various pieces so they are all together. Quote Disclaimer: I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it. Link to comment Share on other sites More sharing options...
trollworkout Posted November 2, 2016 Share Posted November 2, 2016 set it up like I have it set up with proxy and use init and preInit events like I do and you'll be good. and you use GameRegistry.register(block, item whatever..) everything common/Technorcery is my main file look at that and you'll get it Quote Disclaimer: I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it. Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 Also i strongly suggest using GitHub as if you do need help/ something isnt working correctly, someone can easily create a Pull Request and you can see what they changed/added, and learn greatly from it True. I might scrap this and start fresh. If I do, then I'll use Github. Quote Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 set it up like I have it set up with proxy and use init and preInit events like I do and you'll be good. and you use GameRegistry.register(block, item whatever..) everything common/Technorcery is my main file look at that and you'll get it I just arranged it your way and for some reason it's still not working. I have no idea what I've done wrong. My resources path is correct, so I still have no clue why it can't find the JSON file. But I do like the way you have your mod set up! Quote Link to comment Share on other sites More sharing options...
trollworkout Posted November 2, 2016 Share Posted November 2, 2016 set it up like I have it set up with proxy and use init and preInit events like I do and you'll be good. and you use GameRegistry.register(block, item whatever..) everything common/Technorcery is my main file look at that and you'll get it I just arranged it your way and for some reason it's still not working. I have no idea what I've done wrong. My resources path is correct, so I still have no clue why it can't find the JSON file. But I do like the way you have your mod set up! Did you remove the Mod.MODID + ":" part? Try to run the game and read what the error says. It will tell you what's wrong. It will say can't be found and will tell you what can't be found like /test/test/test/something blah blah.json can't be found. This way you can kinda figure out what you did wrong. Lowercase, uppercase , misspelling, .. Quote Disclaimer: I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it. Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 Did you remove the Mod.MODID + ":" part? Try to run the game and read what the error says. It will tell you what's wrong. It will say can't be found and will tell you what can't be found like /test/test/test/something blah blah.json can't be found. This way you can kinda figure out what you did wrong. Lowercase, uppercase , misspelling, .. Yeah, I removed that. Followed your example to a T. Usually error reports are my best friend, but this one doesn't seem to help since the path it's specifying is literally the same structure I have in my resources folder. Here's the error report: http://hastebin.com/muxeborinu.rb And my folder structure: https://gyazo.com/ccb0bda2a43365ceff4e0beada180e98 Quote Link to comment Share on other sites More sharing options...
trollworkout Posted November 2, 2016 Share Posted November 2, 2016 Based on what I read is looking for a blockstate. That means your item is actually a block. For items make sure you use "inventory" on the model loader. For blocks use "variants" "normal" or "multipart" + make sure you got a blockstate for each block in addition to models Quote Disclaimer: I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it. Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 Based on what I read is looking for a blockstate. That means your item is actually a block. For items make sure you use "inventory" on the model loader. For blocks use "variants" "normal" or "multipart" + make sure you got a blockstate for each block in addition to models Okay, now that's realllly strange .-. The item I've created is ItemTrainingStaff, which extends (another custom class) ItemBase, which extends Item. Why would it be considering itself a block? O_o Quote Link to comment Share on other sites More sharing options...
abused_master Posted November 2, 2016 Share Posted November 2, 2016 *booooo upload to github, upload to github booooo* Quote Link to comment Share on other sites More sharing options...
Jimmeh Posted November 2, 2016 Author Share Posted November 2, 2016 *booooo upload to github, upload to github booooo* Literally just did. haha. Have fun .-. https://github.com/Jimmeh94/TestMod Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.