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!