Jump to content

Recommended Posts

Posted

Alright, so.... I've been trying to do something that, well, probably all of us have wanted to do at some point. Add side slabs. And... it's not going too well. Currently, I'm getting the error "Cannot set property PropertyEnum{name=dir, clazz=class net.minecraft.util.EnumFacing, values=[down, up, north, south, west, east]} as it does not exist in BlockState{block=null, properties=[variant]}"... but, I've created the property. Here is my code:

 

package blahblahbal.blahmod.blocks;

import java.util.Random;

import blahblahbal.blahmod.Main;
import net.minecraft.block.Block;
import net.minecraft.block.BlockSlab;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public abstract class ModBlockSlab extends BlockSlab {
    /**
     * The property used for the variant.
     * Needed for interactions with ItemSlab.
     */
    public static final PropertyBool VARIANT_PROPERTY = PropertyBool.create("variant");
    public static final PropertyEnum<EnumFacing> DIR = PropertyEnum.<EnumFacing>create("dir", EnumFacing.class);
    /**
     * The unlocalized name.
     */
    private static final String NAME = "stainedBricksSlab";

    /**
     * Hardness value for the material.
     */
    private static final float HARDNESS = 2.0f;

    /**
     * Resistance value for the material.
     */
    private static final float RESISTANCE = 10.0f;

    /**
     * The bit in metadata used by the half property.
     */
    private static final int HALF_META_BIT = 8;

    /**
     * Name - needed for creating the model.
     */
    public String name;
    public abstract Item getHalfSlabReference();
    /**
     * Initializes a new instance of the ModBlockSlab class.
     * @param uname the unlocalized name of this ModBlockSlab
     */
    public ModBlockSlab(String uname, Material m) {
        super(m);
        this.useNeighborBrightness = !this.isDouble();
        setHardness(HARDNESS);
        setResistance(RESISTANCE);
        setStepSound(soundTypePiston);
        this.name = uname;
        setUnlocalizedName(uname);
        if (uname == "sequoiaSlab" || uname == "palmSlab" || uname == "cedarSlab" || uname == "dreadSlab" || uname == "frostSlab")
        {
        	this.setStepSound(soundTypeWood);
        	this.setHarvestLevel("axe", 0);
        }
        if (uname == "dirtSlab" || uname == "grassSlab")
        {
        	this.setStepSound(soundTypeGrass);
        	this.setHarvestLevel("shovel", 0);
        }
        if (uname == "leatherSlab" || uname == "woolSlab")
        {
        	this.setStepSound(soundTypeCloth);
        }
        if (!this.isDouble()) {
            setCreativeTab(Main.blahTabBlock);
        }
        IBlockState blockState = this.createBlockState().getBaseState();
        
        blockState = blockState.withProperty(VARIANT_PROPERTY, false).withProperty(DIR, EnumFacing.NORTH);
        
        if (!this.isDouble() && !this.name.contains("side"))
        {
            blockState = blockState.withProperty(HALF, EnumBlockHalf.BOTTOM);
        }

        setDefaultState(blockState);
    }

    /**
     * Gets the ID for the game registry.
     * @return the unique id for the registry.
     */
    public final String getId() {
        return this.innerGetId(this.isDouble());
    }

    /**
     * Gets the unlocalized name based on metadata/damage.
     * @param metadata block metadata.
     * @return the unlocalized name.
     */
    @Override
    public final String getUnlocalizedName(final int metadata) {
        return this.getUnlocalizedName();
    }

    /**
     * Gets the value of the variant property based on the item.
     * @param itemStack item stack.
     * @return the variant value null.
     */
    @Override
    public final Object getVariant(final ItemStack itemStack) {
        return false;
    }

    /**
     * Gets the variant property.
     * @return the variant property null.
     */
    @Override
    public final IProperty getVariantProperty() {
        return VARIANT_PROPERTY;
    }
    @Override
    public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos)
    {
    	if (!this.name.contains("side"))
    	{
    		super.setBlockBoundsBasedOnState(worldIn, pos);
    	}
    	else
    	{
    		if (this.isDouble())
            {
                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
            }
            else
            {
                IBlockState iblockstate = worldIn.getBlockState(pos);

                if (iblockstate.getBlock() == this)
                {
                    if (iblockstate.getValue(DIR) == EnumFacing.NORTH)
                    {
                        this.setBlockBounds(0.5F, 0F, 0F, 1F, 1F, 1F);
                    }
                    else if (iblockstate.getValue(DIR) == EnumFacing.EAST)
                    {
                        this.setBlockBounds(0F, 0F, 0.5F, 1F, 1F, 1F);
                    }
                    else if (iblockstate.getValue(DIR) == EnumFacing.WEST)
                    {
                        this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 0.5F); 
                    }
                    else if (iblockstate.getValue(DIR) == EnumFacing.SOUTH)
                    {
                        this.setBlockBounds(0F, 0F, 0F, 0.5F, 1F, 1F);
                    }
                }
            }
    	}
    }
    @Override
    public void setBlockBoundsForItemRender()
    {
    	if (!this.name.contains("side"))
    	{
    		if (this.isDouble())
            {
                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
            }
            else
            {
                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
            }
    	}
    	else
    	{
	        if (this.isDouble())
	        {
	            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
	        }
	        else
	        {
	            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1F, 0.5F);
	        }
    	}
    }
    @Override
    public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
    {
    	if (this.name.contains("side"))
    	{
    		IBlockState iblockstate = super.onBlockPlaced(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer).withProperty(HALF, BlockSlab.EnumBlockHalf.BOTTOM);
            if (this.isDouble()) return iblockstate;
            else if (facing == EnumFacing.NORTH)
            {
            	return iblockstate.withProperty(DIR, EnumFacing.NORTH);
            }
            else if (facing == EnumFacing.EAST)
            {
            	return iblockstate.withProperty(DIR, EnumFacing.EAST);
            }
            else if (facing == EnumFacing.WEST)
            {
            	return iblockstate.withProperty(DIR, EnumFacing.WEST);
            }
            else if (facing == EnumFacing.SOUTH)
            {
            	return iblockstate.withProperty(DIR, EnumFacing.SOUTH);
            }
    	}
    	IBlockState iblockstate = super.onBlockPlaced(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer).withProperty(HALF, BlockSlab.EnumBlockHalf.BOTTOM);
    	return this.isDouble() ? iblockstate : (facing != EnumFacing.DOWN && (facing == EnumFacing.UP || (double)hitY <= 0.5D) ? iblockstate : iblockstate.withProperty(HALF, BlockSlab.EnumBlockHalf.TOP));
    }

    /**
     * Gets a block state from metadata.
     * @param meta the metadata or color value.
     * @return a block state with the meta encoded as the variant property.
     */
    @Override
    public final IBlockState getStateFromMeta(final int meta) {
        IBlockState blockState = this.getDefaultState();
        blockState = blockState.withProperty(VARIANT_PROPERTY, false);
        if (!this.isDouble())
        {
        	if (!this.name.contains("side"))
        	{
        		EnumBlockHalf value = EnumBlockHalf.BOTTOM;
                if ((meta & HALF_META_BIT) != 0)
                {
                    value = EnumBlockHalf.TOP;
                }
                blockState = blockState.withProperty(HALF, value);
        	}
        	else
        	{
        		EnumFacing value = EnumFacing.NORTH;
        		if (meta  == 2)
        		{
        			value = EnumFacing.SOUTH;
        		}
        		else if (meta == 3)
        		{
        			value = EnumFacing.WEST;
        		}
        		else if (meta == 4)
        		{
        			value = EnumFacing.EAST;
        		}
        		blockState = blockState.withProperty(DIR, value);
        	}
        }

        return blockState;
    }
    @Override
    public int quantityDropped(Random r)
    {
    	return this.isDouble() ? 2 : 1;
    }
    /**
     * Gets the metadata value from a block state.
     * @param state the block state.
     * @return the metadata or color value.
     */
    @Override
    public final int getMetaFromState(final IBlockState state) {
        if (this.isDouble())
        {
           return 0;
        }
        if (!this.name.contains("side"))
        {
        	if ((EnumBlockHalf)state.getValue(HALF) == EnumBlockHalf.TOP) {
                return HALF_META_BIT;
            }
            else
            {
                return 0;
            }
        }
        else
        {
        	if ((EnumFacing)state.getValue(DIR) == EnumFacing.NORTH)
        	{
        		return 1;
        	}
        	else if ((EnumFacing)state.getValue(DIR) == EnumFacing.SOUTH)
        	{
        		return 2;
        	}
        	else if ((EnumFacing)state.getValue(DIR) == EnumFacing.WEST)
        	{
        		return 3;
        	}
        	else if ((EnumFacing)state.getValue(DIR) == EnumFacing.EAST)
        	{
        		return 4;
        	}
        	return 0;
        }
    }

    /**
     * Gets the damage for the block's item when dropped.
     * @param state the block's state.
     * @return the metadata or color value.
     */
    @Override
    public final int damageDropped(final IBlockState state) {
        return 0;
    }

    /**
     * Gets the item dropped when the block is broken.
     * @param blockState the block's state.
     * @param random the random number generator
     * @param unused an integer.
     * @return the half slab item.
     */
    @Override
    public final Item getItemDropped(final IBlockState blockState, final java.util.Random random, final int unused)
    {
        return this.getHalfSlabReference();
    }
    /**
     * Gets the item dropped when the block is broken.
     * @param world the world
     * @param blockPos the block position.
     * @return the item dropped, the half slab.
     */
    /*@SideOnly(Side.CLIENT)
    @Override
    public final net.minecraft.item.Item getItem(
        final net.minecraft.world.World world,
        final net.minecraft.util.BlockPos blockPos) {
        String blockId = this.innerGetId(this.isDouble());
        if (blockId.substring(0, 7) == "double_")
        {
        	ItemStack i = new ItemStack(GameRegistry.findItem("blahmod", blockId.substring(7)), 2);
        	return i.getItem();
        }
        return GameRegistry.findItem("blahmod", blockId);
    }*/

    /**
     * Creates the block state object.
     * @return the block state with properties defined.
     */
    @Override
    protected final BlockState createBlockState() {
        if (this.isDouble())
        {
            return new BlockState(this, new IProperty[] {VARIANT_PROPERTY});
        }
        else
        {
        	/*if (this.name.contains("side"))
        	{
        		return new BlockState(this, new IProperty[] {VARIANT_PROPERTY, DIR});
        	}*/
        	return new BlockState(this, new IProperty[] {VARIANT_PROPERTY, HALF, DIR});
        }
    }

    /**
     * Gets the ID of the block.
     * @param isDoubleStacked override the isDouble() method.
     * @return the unique block id.
     */
    private String innerGetId(final boolean isDoubleStacked) {
        String result = "";
        if (isDoubleStacked) {
            result = "double_";
        }
        String ID = "";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs[0]))
        	ID = "woolSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs[1]))
        	ID = "ironSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs[2]))
        	ID = "goldSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs[3]))
        	ID = "diamondSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs[4]))
        	ID = "emeraldSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs[5]))
        	ID = "sulphurSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs[6]))
        	ID = "limestoneSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs[7]))
        	ID = "uraniumSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs2[0]))
        	ID = "dirtSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs2[1]))
        	ID = "grassSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs2[2]))
        	ID = "leatherSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs2[3]))
        	ID = "lapisSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs2[4]))
        	ID = "obsidianSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs2[5]))
        	ID = "mossSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs2[6]))
        	ID = "endStoneBrickSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs2[7]))
        	ID = "tadaniteSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.woodSlabs[0]))
        	ID = "sequoiaSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.woodSlabs[1]))
        	ID = "palmSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.woodSlabs[2]))
        	ID = "cedarSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.woodSlabs[3]))
        	ID = "petrifiedWoodSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.woodSlabs[4]))
        	ID = "dreadSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.woodSlabs[5]))
        	ID = "dreadSandSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.woodSlabs[6]))
        	ID = "blackSandSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.woodSlabs[7]))
        	ID = "frostSlab";
       	if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs3[0]))
        	ID = "blazeSlab";
        if (Block.getIdFromBlock(this) == Block.getIdFromBlock(ModBlocks.slabs3[1]))
        	ID = "frostBrickSlab";

        return result + ID;
    }
}

 

Don't think that I know what I'm doing, because I don't. Don't criticize me because of that. All I want to know is *why* my code is causing the error I mentioned above, and how to fix it.

 

I know it's possible to do this, because furnaces grab the direction you're facing and swap that when you place them. What I don't know is why it's giving me that error.

 

(Also, the metadata saving/loading is probably wrong, and I'd like help with that if so. But the first priority is fixing the error. Further, I don't need criticisms on me not using metadata for different slab types. I know that this is bad practice, but I likely won't be releasing this mod, especially since this is a practice ground for me. I'll also likely be updating to a later version of Minecraft. I've delayed for so long because of the crap combat system in 1.9+.)

Posted (edited)

Okay so now I'm running into a similar problem. It now says "Cannot set property PropertyDirection{name=dir, clazz=class net.minecraft.util.EnumFacing, values=[down, up]} to north on block null, it is not an allowed value." But... why is the block null? I don't understand why or how it could be null.

 

EDIT: I've resorted to extending the Block class for a new ModBlockSideSlab class, and then creating a ModItemBlockSideSlab class, and a ModBlockSideSlabHalf class. No double slab class is needed because that would be pointless.

Edited by blahblahbal

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.