Posted January 27, 20178 yr Hello once again, world! I have a little big Problem with custom slab/stairs blocks. When placing them, they don't adjust and just stay in their "base state". I debugged it a little bit and saw, that the right Blockstate has been computed, but when actually placing the block in World.setBlockState(...) it sets it to the wrong state (Slabs are ALWAYS on the bottom, stairs ALWAYS facing east, in outer-right shape and on the bottom as well). Guess I forgot to include something, but I can't find it any where. That's what I HAVE done... 1...in my Custom SlabBlock Class: - setDefaultState to a Variant of my Tree Types - override getStateFromMeta, getMetaFromState and damageDropped, since I have several SubTypes of that Block. - override createBlockState adding my custom Variant Property and BlockSlab's HALF property - override getVariantProperty and getVariant, so the slab-to-double-slab thing works Code: public static final PropertyEnum VARIANT = PropertyEnum.create("variant", ModWoodBlock.EnumType.class); public ModSlabBlock(Iterable<? extends DefinesSlab> subBlocks) { super(ImmutableList.copyOf(subBlocks)); setCreativeTab(TheMod.INSTANCE.creativeTab()); setHardness(2.0F); setResistance(5.0F); setStepSound(soundTypeWood); setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, ModWoodBlock.EnumType.ACEMUS)); } @Override protected String resourcePrefix() { return TheMod.getResourcePrefix(); } @Override public IBlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(VARIANT, ModWoodBlock.EnumType.fromId(meta)); } @Override public int getMetaFromState(IBlockState state) { ModWoodBlock.EnumType type = (ModWoodBlock.EnumType) state.getValue(VARIANT); return type.ordinal(); } @Override public int damageDropped(IBlockState state) { return getMetaFromState(state); } @Override protected BlockState createBlockState(){ return new BlockState(this, new IProperty[] { VARIANT , HALF}); } @Override public IProperty getVariantProperty() { return VARIANT; } @Override public Object getVariant(ItemStack stack) { if(stack.getItem() instanceof ItemBlock && ((ItemBlock)stack.getItem()).getBlock() instanceof ModSlabBlock){ return getStateFromMeta(stack.getItem().getDamage(stack)).getValue(VARIANT); } return null; } 2... in my Custom Stairs Class: The same things, only without the custom variant property part, since it's one type per Block. Code: private ModWoodBlock.EnumType variant; public ModStairsBlock(DefinesStairs definition) { super(definition); variant=(ModWoodBlock.EnumType)definition.stairsModelSubBlockVariant(); setCreativeTab(TheMod.INSTANCE.creativeTab()); } @Override protected String resourcePrefix() { return TheMod.getResourcePrefix(); } @Override protected BlockState createBlockState(){ return new BlockState(this, new IProperty[] {FACING,HALF,SHAPE}); } @Override public IBlockState getStateFromMeta(int meta) { return getDefaultState(); } @Override public int getMetaFromState(IBlockState state) { return 0; } @Override public int damageDropped(IBlockState state) { return 0; } 3. There is also a Custom Slab Item Class, if I want to customize some code there. But at the moment, it only has a constructor. Code: public ModSlabItem(Block block, ModSlabBlock singleSlab, ModSlabBlock doubleSlab) { super(block, singleSlab, doubleSlab); } 4. Registering the block item models The stairs block public void registerBlockModel(int i) { String iconName = getUnlocalizedName().substring(getUnlocalizedName().indexOf('.')+1); iconName = iconName.substring(0,iconName.indexOf('.'))+i; Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(this),0,new ModelResourceLocation(iconName,"inventory"));//iconName is "modid:stairs<integer> } and the slab block public final void registerBlockModels() { for (int i = 0; i < subBlocks.size(); i++) { final String iconName = String.format("slab_%s", subBlocks.get(i).slabModelSubBlockVariant().name().toLowerCase().replace('.', '_')); Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(this),i,new ModelResourceLocation(resourcePrefix()+iconName,"inventory"));//iconName is "modid:slab_<variant> } } 5. Registering the Blocks private static void registerStairsBlock(Block block, String name)//name is "stairs<integer>" { GameRegistry.registerBlock(block, name); Blocks.fire.setFireInfo(block, DEFAULT_STAIRS_FIRE_ENCOURAGEMENT, DEFAULT_STAIRS_FLAMMABILITY); } private static void registerSlabBlock(Block block, String name, SlabBlock singleSlab, SlabBlock doubleSlab)//name is "sslab<integer>" and "dslab<integer>" { GameRegistry.registerBlock(block, ModSlabItem.class, name, singleSlab, doubleSlab); //tying Block to custom Item class. The last two argumets are arguments for the custom item constructor. } 6. Register the Subblocks of my slabs in the ModelBakery for (SlabBlock block : singleSlabBlocks) { ModelBakery.addVariantName(Item.getItemFromBlock(block), block.getUnlocalizedName().substring(block.getUnlocalizedName().indexOf('.')+1) + "_" + type.getName()); //registered as "modid:slab_<type>" } for (SlabBlock block : doubleSlabBlocks) { ModelBakery.addVariantName(Item.getItemFromBlock(block), block.getUnlocalizedName().substring(block.getUnlocalizedName().indexOf('.')+1) + "_" + type.getName()); //registered as "modid:slab_<type>" } 7. Added BlockState, BlockModel and ItemModel. As I said, no errors from forge in this regard. But I'll post the code anyway Blockstates: sslab0.json: { "variants": { "half=bottom,variant=acemus": { "model": "dendrology:slab_bottom_acemus" }, "half=bottom,variant=cedrum": { "model": "dendrology:slab_bottom_cedrum" }, "half=bottom,variant=cerasu": { "model": "dendrology:slab_bottom_cerasu" }, "half=bottom,variant=delnas": { "model": "dendrology:slab_bottom_delnas" }, "half=bottom,variant=ewcaly": { "model": "dendrology:slab_bottom_ewcaly" }, "half=bottom,variant=hekur": { "model": "dendrology:slab_bottom_hekur" }, "half=bottom,variant=kiparis": { "model": "dendrology:slab_bottom_kiparis" }, "half=bottom,variant=kulist": { "model": "dendrology:slab_bottom_kulist" }, "half=bottom,variant=lata": { "model": "dendrology:slab_bottom_lata" }, "half=bottom,variant=nucis": { "model": "dendrology:slab_bottom_nucis" }, "half=bottom,variant=porffor": { "model": "dendrology:slab_bottom_porffor" }, "half=bottom,variant=salyx": { "model": "dendrology:slab_bottom_salyx" }, "half=bottom,variant=tuopa": { "model": "dendrology:slab_bottom_tuopa" }, "half=top,variant=acemus": { "model": "dendrology:slab_top_acemus" }, "half=top,variant=cedrum": { "model": "dendrology:slab_top_cedrum" }, "half=top,variant=cerasu": { "model": "dendrology:slab_top_cerasu" }, "half=top,variant=delnas": { "model": "dendrology:slab_top_delnas" }, "half=top,variant=ewcaly": { "model": "dendrology:slab_top_ewcaly" }, "half=top,variant=hekur": { "model": "dendrology:slab_top_hekur" }, "half=top,variant=kiparis": { "model": "dendrology:slab_top_kiparis" }, "half=top,variant=kulist": { "model": "dendrology:slab_top_kulist" }, "half=top,variant=lata": { "model": "dendrology:slab_top_lata" }, "half=top,variant=nucis": { "model": "dendrology:slab_top_nucis" }, "half=top,variant=porffor": { "model": "dendrology:slab_top_porffor" }, "half=top,variant=salyx": { "model": "dendrology:slab_top_salyx" }, "half=top,variant=tuopa": { "model": "dendrology:slab_top_tuopa" } } } dslab0.json: { "variants": { "half=bottom,variant=acemus": { "model": "dendrology:planks_acemus" }, "half=bottom,variant=cedrum": { "model": "dendrology:planks_cedrum" }, "half=bottom,variant=cerasu": { "model": "dendrology:planks_cerasu" }, "half=bottom,variant=delnas": { "model": "dendrology:planks_delnas" }, "half=bottom,variant=ewcaly": { "model": "dendrology:planks_ewcaly" }, "half=bottom,variant=hekur": { "model": "dendrology:planks_hekur" }, "half=bottom,variant=kiparis": { "model": "dendrology:planks_kiparis" }, "half=bottom,variant=kulist": { "model": "dendrology:planks_kulist" }, "half=bottom,variant=lata": { "model": "dendrology:planks_lata" }, "half=bottom,variant=nucis": { "model": "dendrology:planks_nucis" }, "half=bottom,variant=porffor": { "model": "dendrology:planks_porffor" }, "half=bottom,variant=salyx": { "model": "dendrology:planks_salyx" }, "half=bottom,variant=tuopa": { "model": "dendrology:planks_tuopa" }, "half=top,variant=acemus": { "model": "dendrology:planks_acemus" }, "half=top,variant=cedrum": { "model": "dendrology:planks_cedrum" }, "half=top,variant=cerasu": { "model": "dendrology:planks_cerasu" }, "half=top,variant=delnas": { "model": "dendrology:planks_delnas" }, "half=top,variant=ewcaly": { "model": "dendrology:planks_ewcaly" }, "half=top,variant=hekur": { "model": "dendrology:planks_hekur" }, "half=top,variant=kiparis": { "model": "dendrology:planks_kiparis" }, "half=top,variant=kulist": { "model": "dendrology:planks_kulist" }, "half=top,variant=lata": { "model": "dendrology:planks_lata" }, "half=top,variant=nucis": { "model": "dendrology:planks_nucis" }, "half=top,variant=porffor": { "model": "dendrology:planks_porffor" }, "half=top,variant=salyx": { "model": "dendrology:planks_salyx" }, "half=top,variant=tuopa": { "model": "dendrology:planks_tuopa" } } } stairs0.json: { "variants":{ "facing=north,half=bottom,shape=straight":{"model":"dendrology:acemus_straight_stairs","y":270,"uvlock":true}, "facing=south,half=bottom,shape=straight":{"model":"dendrology:acemus_straight_stairs","y":90,"uvlock":true}, "facing=east,half=bottom,shape=straight":{"model":"dendrology:acemus_straight_stairs","y":0,"uvlock":false}, "facing=west,half=bottom,shape=straight":{"model":"dendrology:acemus_straight_stairs","y":180,"uvlock":true}, "facing=north,half=bottom,shape=inner_left":{"model":"dendrology:acemus_inner_stairs","y":270,"uvlock":true}, "facing=south,half=bottom,shape=inner_left":{"model":"dendrology:acemus_inner_stairs","y":90,"uvlock":true}, "facing=east,half=bottom,shape=inner_left":{"model":"dendrology:acemus_inner_stairs","y":0,"uvlock":false}, "facing=west,half=bottom,shape=inner_left":{"model":"dendrology:acemus_inner_stairs","y":180,"uvlock":true}, "facing=north,half=bottom,shape=inner_right":{"model":"dendrology:acemus_inner_stairs","y":270,"uvlock":true}, "facing=south,half=bottom,shape=inner_right":{"model":"dendrology:acemus_inner_stairs","y":90,"uvlock":true}, "facing=east,half=bottom,shape=inner_right":{"model":"dendrology:acemus_inner_stairs","y":0,"uvlock":false}, "facing=west,half=bottom,shape=inner_right":{"model":"dendrology:acemus_inner_stairs","y":180,"uvlock":true}, "facing=north,half=bottom,shape=outer_left":{"model":"dendrology:acemus_outer_stairs","y":270,"uvlock":true}, "facing=south,half=bottom,shape=outer_left":{"model":"dendrology:acemus_outer_stairs","y":90,"uvlock":true}, "facing=east,half=bottom,shape=outer_left":{"model":"dendrology:acemus_outer_stairs","y":0,"uvlock":false}, "facing=west,half=bottom,shape=outer_left":{"model":"dendrology:acemus_outer_stairs","y":180,"uvlock":true}, "facing=north,half=bottom,shape=outer_right":{"model":"dendrology:acemus_outer_stairs","y":270,"uvlock":true}, "facing=south,half=bottom,shape=outer_right":{"model":"dendrology:acemus_outer_stairs","y":90,"uvlock":true}, "facing=east,half=bottom,shape=outer_right":{"model":"dendrology:acemus_outer_stairs","y":0,"uvlock":false}, "facing=west,half=bottom,shape=outer_right":{"model":"dendrology:acemus_outer_stairs","y":180,"uvlock":true}, "facing=north,half=top,shape=straight":{"model":"dendrology:acemus_straight_stairs","x":180,"y":270,"uvlock":true}, "facing=south,half=top,shape=straight":{"model":"dendrology:acemus_straight_stairs","x":180,"y":90,"uvlock":true}, "facing=east,half=top,shape=straight":{"model":"dendrology:acemus_straight_stairs","x":180,"y":0,"uvlock":true}, "facing=west,half=top,shape=straight":{"model":"dendrology:acemus_straight_stairs","x":180,"y":180,"uvlock":true}, "facing=north,half=top,shape=inner_left":{"model":"dendrology:acemus_inner_stairs","x":180,"y":270,"uvlock":true}, "facing=south,half=top,shape=inner_left":{"model":"dendrology:acemus_inner_stairs","x":180,"y":90,"uvlock":true}, "facing=east,half=top,shape=inner_left":{"model":"dendrology:acemus_inner_stairs","x":180,"y":0,"uvlock":true}, "facing=west,half=top,shape=inner_left":{"model":"dendrology:acemus_inner_stairs","x":180,"y":180,"uvlock":true}, "facing=north,half=top,shape=inner_right":{"model":"dendrology:acemus_inner_stairs","x":180,"y":270,"uvlock":true}, "facing=south,half=top,shape=inner_right":{"model":"dendrology:acemus_inner_stairs","x":180,"y":90,"uvlock":true}, "facing=east,half=top,shape=inner_right":{"model":"dendrology:acemus_inner_stairs","x":180,"y":0,"uvlock":true}, "facing=west,half=top,shape=inner_right":{"model":"dendrology:acemus_inner_stairs","x":180,"y":180,"uvlock":true}, "facing=north,half=top,shape=outer_left":{"model":"dendrology:acemus_outer_stairs","x":180,"y":270,"uvlock":true}, "facing=south,half=top,shape=outer_left":{"model":"dendrology:acemus_outer_stairs","x":180,"y":90,"uvlock":true}, "facing=east,half=top,shape=outer_left":{"model":"dendrology:acemus_outer_stairs","x":180,"y":0,"uvlock":true}, "facing=west,half=top,shape=outer_left":{"model":"dendrology:acemus_outer_stairs","x":180,"y":180,"uvlock":true}, "facing=north,half=top,shape=outer_right":{"model":"dendrology:acemus_outer_stairs","x":180,"y":270,"uvlock":true}, "facing=south,half=top,shape=outer_right":{"model":"dendrology:acemus_outer_stairs","x":180,"y":90,"uvlock":true}, "facing=east,half=top,shape=outer_right":{"model":"dendrology:acemus_outer_stairs","x":180,"y":0,"uvlock":true}, "facing=west,half=top,shape=outer_right":{"model":"dendrology:acemus_outer_stairs","x":180,"y":180,"uvlock":true} } } stairs1-stairs12: like stairs0, but with a different Variant in the block model name instead Block Models: slab_top_<variant>.json: { "parent": "block/upper_slab", "textures": { "bottom": "dendrology:blocks/planks_<variant>", "top": "dendrology:blocks/planks_<variant>", "side": "dendrology:blocks/planks_<variant>" } } slab_bottom_<variant>.json: { "parent": "block/half_slab", "textures": { "bottom": "dendrology:blocks/planks_<variant>", "top": "dendrology:blocks/planks_<variant>", "side": "dendrology:blocks/planks_<variant>" } } <variant>_straight_stairs.json: { "parent": "block/stairs", "textures": { "bottom": "dendrology:blocks/planks_<variant>", "top": "dendrology:blocks/planks_<variant>", "side": "dendrology:blocks/planks_<variant>" } } <variant>_inner_stairs.json: { "parent": "block/inner_stairs", "textures": { "bottom": "dendrology:blocks/planks_<variant>", "top": "dendrology:blocks/planks_<variant>", "side": "dendrology:blocks/planks_<variant>" } } <variant>_outer_stairs.json: { "parent": "block/outer_stairs", "textures": { "bottom": "dendrology:blocks/planks_<variant>", "top": "dendrology:blocks/planks_<variant>", "side": "dendrology:blocks/planks_<variant>" } } Item Models: slab_<variant>.json: { "parent": "dendrology:block/slab_bottom_<variant>", "display": { "thirdperson": { "rotation": [ 10, -45, 170 ], "translation": [ 0, 1.5, -2.75 ], "scale": [ 0.5, 0.5, 0.5 ] } } } stairs0.json: { "parent": "dendrology:block/acemus_straight_stairs", "display": { "thirdperson": { "rotation": [ 10, -45, 170 ], "translation": [ 0, 1.5, -2.75 ], "scale": [ 0.5, 0.5, 0.5 ] }, "gui": { "rotation": [ 0, 180, 0 ] } } } stairs1-stairs12: like stairs0, but with a different Variant in the block model name instead A Big Thanks already to anybody reading this whole thing You'll get another one if you can help me fixing the problem! Sincerely, A13XIS
January 27, 20178 yr First of all, metadata can only hold 16 values. Secondly, the HALF variant isn't set to change anywhere in your code. MobDrops http://www.planetminecraft.com/mod/125-mobdrops/
January 27, 20178 yr Author Thanks for the answer! After reading the tutorial to slabs I understood what you mean. There's only a problem with the stairs now. First of all, metadata can only hold 16 values. Secondly, the HALF variant isn't set to change anywhere in your code. That's absolutely true, but it doesn't make a lot of sence. The Minecraft buit-in stairs have way more than 16 states as well. I mean they have 3 properties which result in 40 blockstates. Minecraft doesn't use different blocks for the same stairs, does it? But okay. I guess I can fix that. For the slabs, at least. Sincerely, A13XIS
January 27, 20178 yr Only the BlockStairs.HALF and BlockStairs.FACING properties are stored in metadata, the BlockStairs.SHAPE property is set in the actual state ( BlockStairs#getActualState ). Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
January 27, 20178 yr Author Oh. That... makes sence Well, I guess I can mark it as solved then. Have a virtual cookie! Sincerely, A13XIS
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.