Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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

 

You'll get another one if you can help me fixing the problem!

 

 

Sincerely,

A13XIS

  • 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

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.

  • Author

Oh. That... makes sence  :o

 

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.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.