Jump to content

1.10 Blocks with multiple properties


blinky000

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 :(

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by Draco18s
  • Like 1

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.

Link to comment
Share on other sites

    @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

 

Link to comment
Share on other sites

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 :D

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.