Jump to content

[SOLVED][1.8]Problem with BlockStates - Slabs'n'Stairs


TheA13X

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

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.