Posted March 27, 20178 yr public class ModBlocksInit { public static ArrayList<Block> blockList = new ArrayList<Block>(); public static ModBlockPlanksEW planksEW; public static ModBlockWainsCorner wainsCorner; public static ModBlockTudorSet tudorSet; public static IBlockState plankStair; static Block block0; public static void init(){ block0 = new ModBlock("brick_ew",Material.ROCK,"brick_ew",Main.CREATIVE_TAB); //blockList.add(new ModBlock("brick_ew",Material.ROCK,"brick_ew",Main.CREATIVE_TAB)); blockList.add(block0); blockList.add(new ModBlock("blue_marble",Material.ROCK,"blue_marble",Main.CREATIVE_TAB)); blockList.add(new ModBlock("blocktudor1",Material.CLAY,"BlockTudor1",Main.CREATIVE_TAB)); blockList.add(new ModBlock("blue_cobble_stone",Material.ROCK,"blue_cobble_stone",Main.CREATIVE_TAB)); blockList.add(new ModBlock("blue_rug",Material.CARPET,"blue_rug",Main.CREATIVE_TAB)); blockList.add(new ModBlockTudorSet1()); blockList.add(new ModBlockWains()); //new BlockStairs(block0.getDefaultState())).setUnlocalizedName("stairsStone")); Iterator<Block> it = blockList.iterator(); while(it.hasNext()){ Block block = it.next(); GameRegistry.register(block);// registers the block // creates item from the block and registers it ItemBlock item = new ItemBlock(block); item.setRegistryName(block.getRegistryName()); GameRegistry.register(item); // creates the item view for inventory ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(),"inventory")); } // for the variants ***************************** // ModBlockPlanksEW planksEW = new ModBlockPlanksEW(); GameRegistry.register(planksEW); ItemMultiTexture item = new ItemMultiTexture(planksEW, planksEW, ModBlockPlanksEW.subTypes); item.setRegistryName(planksEW.getRegistryName()); GameRegistry.register(item); StateMapperBase b = new DefaultStateMapper(); BlockStateContainer bsc = planksEW.getBlockState(); ImmutableList<IBlockState> values = bsc.getValidStates(); for(IBlockState state : values) { String str = b.getPropertyString(state.getProperties()); _registerBlockItemModelForMeta(planksEW, planksEW.getMetaFromState(state), str); } // ModBlockWainsCorner *********************************** wainsCorner = new ModBlockWainsCorner(); GameRegistry.register(wainsCorner); // using item , b , bsc, values from above fix this item = new ItemMultiTexture(wainsCorner, wainsCorner, ModBlockWainsCorner.subTypes); item.setRegistryName(wainsCorner.getRegistryName()); GameRegistry.register(item); b = new DefaultStateMapper(); bsc = wainsCorner.getBlockState(); values = bsc.getValidStates(); for(IBlockState state : values) { String str = b.getPropertyString(state.getProperties()); _registerBlockItemModelForMeta(wainsCorner, wainsCorner.getMetaFromState(state), str); } // ModBlockTudorSet ************************************ tudorSet = new ModBlockTudorSet(); GameRegistry.register(tudorSet); // using item , b , bsc, values from above fix this item = new ItemMultiTexture(tudorSet, tudorSet, new String[] {"s0b0", "s0b1", "s0b2", "s0b3"}); item.setRegistryName(tudorSet.getRegistryName()); GameRegistry.register(item); b = new DefaultStateMapper(); bsc = tudorSet.getBlockState(); values = bsc.getValidStates(); //System.out.println("##############################"); for(IBlockState state : values) { String str = b.getPropertyString(state.getProperties()); //System.out.println(tudorSet.getMetaFromState(state)+" : "+ str); _registerBlockItemModelForMeta(tudorSet, tudorSet.getMetaFromState(state), str); } //System.out.println("##############################"); } // from Draco18s Minecraft Forge forum private static void _registerBlockItemModelForMeta(Block block, int metadata, String variant) { final Item item = Item.getItemFromBlock(block); if (item != null) { _registerItemModelForMeta(item, metadata, variant); } } private static void _registerItemModelForMeta(Item item, int metadata, String variant) { ModelResourceLocation res = new ModelResourceLocation(item.getRegistryName(), variant); _registerItemModelForMeta(item, metadata, res); } private static void _registerItemModelForMeta(Item item, int metadata, ModelResourceLocation modelResourceLocation) { ModelLoader.setCustomModelResourceLocation(item, metadata, modelResourceLocation); } } For ModBlockTudorSet; it has to properties "facing" and a custom "style". In the inventory i get four blocks, wrong models , correct names from the string when creating the ItemMultiTexture . There is only one Blockstate ModBlockTudorSet.json, that seems to be fine for the block (i tested it with a hammer that runs through all 16 metas) When the block is placed, it faces the player, but it is always style "s0b0" no matter which block i pick in the inventory. It have watched registers all the states, but only the four show up in inventory, why not all 16? dosn't matter how many entries in the MultiTexture string. What i am envisioning is four blocks in the inventory, 1 for each "style" the placement takes care of setting the facing. Thanks in advance
March 28, 20178 yr Author Resolved: ModBlockTudorSet.class @SideOnly(Side.CLIENT) public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) { // item , amount, meta list.add(new ItemStack(itemIn)); list.add(new ItemStack(itemIn, 1, 4)); list.add(new ItemStack(itemIn, 1, 8)); list.add(new ItemStack(itemIn, 1, 12)); } ModBlocksInit.class // ModBlockTudorSet ************************************ tudorSet = new ModBlockTudorSet(); GameRegistry.register(tudorSet); item = new ItemMultiTexture(tudorSet, tudorSet, ModBlockTudorSet.subTypes; item.setRegistryName(tudorSet.getRegistryName()); GameRegistry.register(item); _registerBlockItemModelForMeta(tudorSet, 0, "facing=east,style=s0b0"); _registerBlockItemModelForMeta(tudorSet, 4, "facing=east,style=s0b1"); _registerBlockItemModelForMeta(tudorSet, 8, "facing=east,style=s0b2"); _registerBlockItemModelForMeta(tudorSet, 12, "facing=east,style=s0b3"); i'm sure there is a cleaner way to get the meta strings
March 28, 20178 yr You mean? for(IBlockState state : values) { String str = mapper.getPropertyString(state.getProperties()); _registerBlockItemModelForMeta(block, block.getMetaFromState(state), str); } There's a reason I wrote registerBlockWithCustomItem(...) Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
March 29, 20178 yr Author When i did that, the 4 inventory blocks end up showing the blank side of the block, and all with the same name. But they do place the correct block, with the correct name. Why do i want to register ALL valid states as an item, when i only need the 4?
March 29, 20178 yr You don't. You only need to register the states that will exist as an item. I'm not sure I wrote a helper function that falls between "all states exist as an item" and "completely custom statemapper" but adding it shouldn't be too difficult. Just don't do it as you had, where the strings are specified next to the item registration. You want a generic way of handling it so that the item/block can specify. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
March 29, 20178 yr Author Thanks, i need to clean up all of my init, too hard coded atm. Generic is always best
March 29, 20178 yr Author Now im really confused. 1) I found out the getsubBlocks() in the block is never called, so i am not sure how then inventory knows it will be using 4 blocks. 2) when i hard coded (which does place the correct blocks with meta, all tho all have the same name) _registerBlockItemModelForMeta(tudorSet, 0, "facing=east,style=s0b0"); _registerBlockItemModelForMeta(tudorSet, 4, "facing=east,style=s0b1"); _registerBlockItemModelForMeta(tudorSet, 8, "facing=east,style=s0b2"); _registerBlockItemModelForMeta(tudorSet, 12, "facing=east,style=s0b3"); the metas' do not match the state from the block , meta 0 is not "facing=east,style=s0b0" , in the block it is "facing=south,style=s0b0." If i use any other meta values , i get the missing texture block in the inventory.What are these metas' ? 3) the facing seems to mean the facing on the block in the inventory panel, east is the left face , north is the right face i'm beginning to miss 1.7
March 29, 20178 yr 1 minute ago, blinky000 said: Now im really confused. 1) I found out the getsubBlocks() in the block is never called, so i am not sure how then inventory knows it will be using 4 blocks. Again, that method is only used for populating the Creative inventory. 1 minute ago, blinky000 said: 2) when i hard coded (which does place the correct blocks with meta, all tho all have the same name) _registerBlockItemModelForMeta(tudorSet, 0, "facing=east,style=s0b0"); _registerBlockItemModelForMeta(tudorSet, 4, "facing=east,style=s0b1"); _registerBlockItemModelForMeta(tudorSet, 8, "facing=east,style=s0b2"); _registerBlockItemModelForMeta(tudorSet, 12, "facing=east,style=s0b3"); the metas' do not match the state from the block , meta 0 is not "facing=east,style=s0b0" , in the block it is "facing=south,style=s0b0." If i use any other meta values , i get the missing texture block in the inventory.What are these metas' ? Name: you need to override the getUnlocalizedName method in your item in order to supply a name that can be localized. Meta: I don't understand your question 1 minute ago, blinky000 said: 3) the facing seems to mean the facing on the block in the inventory panel, east is the left face , north is the right face I am not sure what you want to know here Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
March 30, 20178 yr Author The meta data i used when hard coding 0,4,8,12 and the state strings, do not match the meta and states in the block. In the tudor block, meta 0 gives a state of "facing=south,style=s0b0". If i hard code the meta and state from the block, i get the missing "texture" texture in the inventory. If i change the hard coded metadata to any other numbers beside 0,4,8,12 , i get the missing "texture". I don't understand why using the metadata and block states that match the block don't work. "Name: you need to override the getUnlocalizedName method in your item in order to supply a name that can be localized. " I don't have an "item" block, do you mean in the "block" , and return an unlocalized name according to the state? i'm probably not explaining very well
March 30, 20178 yr 17 minutes ago, blinky000 said: If i hard code the meta and state from the block, i get the missing "texture" texture in the inventory. If i change the hard coded metadata to any other numbers beside 0,4,8,12 , i get the missing "texture". Probably because the item is still being given to the inventory as 0/4/8/12 but you registered an item renderer for a different metadata value. i.e. this chunk: @SideOnly(Side.CLIENT) public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) { // item , amount, meta list.add(new ItemStack(itemIn)); list.add(new ItemStack(itemIn, 1, 4)); list.add(new ItemStack(itemIn, 1, 8)); list.add(new ItemStack(itemIn, 1, 12)); } If you're going to change your metadata values in one place, you need to change them in the other. THIS IS IMPORTANT, IT IS NOT ARBITRARY. Most importantly, you need to use the metadata values that your block actually drops when broken. 17 minutes ago, blinky000 said: I don't have an "item" block, do you mean in the "block" , and return an unlocalized name according to the state? If it exists in your inventory, then you have an item. item = new ItemMultiTexture(tudorSet, tudorSet, ModBlockTudorSet.subTypes; Surprise, there it is. In order to override the unlocalized name you need a custom ItemBlock class. Surprise! Alternatively, pass a name function to the ItemMultiTexture's constructor. E.g. here is how vanilla handles the stone variants: registerItemBlock(Blocks.STONE, (new ItemMultiTexture(Blocks.STONE, Blocks.STONE, new Function<ItemStack, String>() { @Nullable public String apply(@Nullable ItemStack p_apply_1_) { return BlockStone.EnumType.byMetadata(p_apply_1_.getMetadata()).getUnlocalizedName(); } })).setUnlocalizedName("stone")); Edited March 30, 20178 yr by Draco18s Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
March 30, 20178 yr Author @SideOnly(Side.CLIENT) public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) { System.out.println("getSubBlocks"); // item , amount, meta list.add(new ItemStack(itemIn,1,3)); list.add(new ItemStack(itemIn, 1, 7)); list.add(new ItemStack(itemIn, 1, 11)); list.add(new ItemStack(itemIn, 1, 15)); } _registerBlockItemModelForMeta(tudorSet, 3, "facing=east,style=s0b0"); _registerBlockItemModelForMeta(tudorSet, 7, "facing=east,style=s0b1"); _registerBlockItemModelForMeta(tudorSet, 11, "facing=east,style=s0b2"); _registerBlockItemModelForMeta(tudorSet, 15, "facing=east,style=s0b3"); made them match, all looks good except unlocalized names, which i should take care of by creating my own itemBlock
March 30, 20178 yr Author This is what i came up with: // call from blockInit registerMultiPropertyBlock(new ModBlockTudorSet()); private static void registerMultiPropertyBlock(ModBlock mBlock){ GameRegistry.register(mBlock); // need to make a new class for item, extend ItemMultiTexture ItemMultiTexture item = new ItemMultiTexture(mBlock, mBlock, mBlock.getSubTypes()); item.setRegistryName(mBlock.getRegistryName()); GameRegistry.register(item); StateMapperBase b = new DefaultStateMapper(); List<ItemStack> list = new ArrayList<ItemStack>(); mBlock.getSubBlocks(item, Main.CREATIVE_TAB, list); for(ItemStack iStackItem : list){ int meta = iStackItem.getMetadata(); String str = b.getPropertyString(mBlock.getStateFromMeta(meta).getProperties()); _registerBlockItemModelForMeta(mBlock, meta, str); } Again thanks
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.